www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

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