triangle.cpp (3423B)
1 Triangle::Triangle() { 2 } 3 Triangle::Triangle(Vertex left, Vertex top, Vertex right) { 4 c[LEFT] = left; 5 c[TOP] = top; 6 c[RIGHT] = right; 7 } 8 9 float Triangle::cosAngle() const { 10 return (c[LEFT]-c[TOP]).cosAngle(c[RIGHT]-c[TOP]); 11 } 12 13 float Triangle::angle() const { 14 // TODO : gérer le cas d'un angle à 0 ou 180. 15 return std::acos(cosAngle()); 16 } 17 18 float Triangle::minAngle() const { 19 float at = angle(); 20 float ar = Triangle(c[TOP],c[RIGHT],c[LEFT]).angle(); 21 float al = Angle::Pi - at - ar; 22 return std::min(std::min(al, at), ar); 23 } 24 25 float Triangle::maxAngle() const { 26 float at = angle(); 27 float ar = Triangle(c[TOP],c[RIGHT],c[LEFT]).angle(); 28 float al = Angle::Pi - at - ar; 29 return std::max(std::max(al, at), ar); 30 } 31 32 SommetTriangle Triangle::maxAngleCorner() const { 33 float at = angle(); 34 float ar = Triangle(c[TOP],c[RIGHT],c[LEFT]).angle(); 35 float al = Angle::Pi - at - ar; 36 if (al > at && al > ar) return LEFT; 37 else if (at > ar) return TOP; 38 else return RIGHT; 39 } 40 41 SommetTriangle Triangle::minAngleCorner() const { 42 float at = angle(); 43 float ar = Triangle(c[TOP],c[RIGHT],c[LEFT]).angle(); 44 float al = Angle::Pi - at - ar; 45 if (al < at && al < ar) return LEFT; 46 else if (at < ar) return TOP; 47 else return RIGHT; 48 } 49 50 float Triangle::minLength() const { 51 return std::min(std::min((c[LEFT] - c[TOP]).norm(), (c[TOP] - c[RIGHT]).norm()), (c[RIGHT] - c[LEFT]).norm()); 52 } 53 54 float Triangle::maxLength() const { 55 return std::max(std::max((c[LEFT] - c[TOP]).norm(), (c[TOP] - c[RIGHT]).norm()), (c[RIGHT] - c[LEFT]).norm()); 56 } 57 58 Triangle Triangle::inset(CoteTriangle side, float offset) const { 59 Triangle t = (*this) << int(side); 60 Vertex offsetDirection = Triangle(t[TOP], t[LEFT], t[LEFT] + t.normal()).normal(); 61 Vertex rightside = t[RIGHT] - t[TOP]; 62 Vertex base = t[RIGHT] - t[LEFT]; 63 float distTR = offset / offsetDirection.cosAngle(rightside); 64 float distLR = offset / offsetDirection.cosAngle(base); 65 t[TOP] = t[TOP] + rightside.setNorm(distTR); 66 t[LEFT] = t[LEFT] + base.setNorm(distLR); 67 return t >> int(side); 68 } 69 70 Triangle Triangle::insetLTR(float offset) const { 71 return (*this).inset(LEFTSIDE, offset).inset(RIGHTSIDE, offset).inset(BASE, offset); 72 } 73 74 Triangle operator+(const Triangle& t, const Vertex& v) { 75 return Triangle(t[LEFT] + v, t[TOP] + v, t[RIGHT] + v); 76 } 77 78 Vertex Triangle::randomPoint(int seed, int n) const { 79 float rndl = floatInRange(seed, n, 0, 1); 80 float rndr = floatInRange(seed, hash2(n, 42), 0, 1 - rndl); 81 return c[TOP] + (c[LEFT] - c[TOP]) * (rndl) + (c[RIGHT] - c[TOP]) * (rndr); 82 } 83 84 float Triangle::surface() const { 85 float hauteur = Segment(c[TOP], c[LEFT] + (c[TOP] - c[LEFT]).projectOn(c[RIGHT] - c[LEFT])).length(); 86 float base = Segment(c[LEFT], c[RIGHT]).length(); 87 return (base * hauteur) / 2.f; 88 } 89 90 Vertex Triangle::normal() const { 91 return ((c[LEFT] - c[TOP]) * (c[RIGHT] - c[TOP])); 92 } 93 94 Vertex Triangle::normalizedNormal() const { 95 Vertex v = normal(); 96 return v / v.norm(); 97 } 98 99 Triangle Triangle::offsetNormal(float offset) const { 100 return ((*this) + this->normal().setNorm(offset)); 101 } 102 103 Triangle Triangle::insetProportionnal(float prop) { 104 Triangle rTriangle = *this; 105 //ibc : isobarycentre. 106 Vertex ibc = Segment(c[TOP],Segment(c[LEFT],c[RIGHT]).center()).at(2.f/3.f); 107 prop = prop; 108 109 rTriangle[TOP] = Segment(ibc,c[TOP]).at(prop); 110 rTriangle[LEFT] = Segment(ibc,c[LEFT]).at(prop); 111 rTriangle[RIGHT] = Segment(ibc,c[RIGHT]).at(prop); 112 return rTriangle; 113 } 114 115 116 117 118 119