If(){design}else{art} Processing, le livre

28 mars 2018

Déterminer si un point se trouve inscrit dans un triangle

Filed under: Non classé — jean-noël Lafargue @ 8 h 02 min

Pour déterminer si un point est inscrit dans un triangle, nous créons deux fonctions. L’une permet de déterminer le barycentre de trois points. La seconde fonction appellera la première trois fois pour calculer le barycentre des coordonnées du point recherché avec chaque paire de points des trois lignes du triangle :

float barycentre (PVector p1, PVector p2, PVector p3)
{
    return (p1.x - p3.x) * (p2.y - p3.y) - (p2.x - p3.x) * (p1.y - p3.y);
}

boolean dansLeTriangle (PVector pt, PVector v1, PVector v2, PVector v3)
{
    boolean b1, b2, b3;

    b1 = barycentre(pt, v1, v2) < 0 ;
    b2 = barycentre(pt, v2, v3) < 0;
    b3 = barycentre(pt, v3, v1) < 0 ;

    return ((b1 == b2) && (b2 == b3));
}

Un exemple de mise en œuvre :

Dans le programme qui suit, on vérifie si la souris se trouve à l’intérieur d’un triangle ou non, le triangle est rempli en blanc si c’est le cas, en noir sinon.

PVector p1,p2,p3;

void setup() {
  size(500, 500);
  p1 = new PVector(100, 100);
  p2 = new PVector(400, 100);
  p3 = new PVector(250, 400);
}

void draw() { 
  background(255);
  if (dansLeTriangle(new PVector(mouseX, mouseY), p1, p2, p3)) { 
    stroke(0); 
    fill(255);
  } else { 
    noStroke();
    fill(0);
  } 
  triangle(p1.x, p1.y, p2.x, p2.y, p3.x, p3.y);
} 

float barycentre (PVector p1, PVector p2, PVector p3)
{
  return (p1.x - p3.x) * (p2.y - p3.y) - (p2.x - p3.x) * (p1.y - p3.y);
}

boolean dansLeTriangle (PVector pt, PVector v1, PVector v2, PVector v3)
{
  boolean b1, b2, b3;

  b1 = barycentre(pt, v1, v2) <   0;
  b2 = barycentre(pt, v2, v3) <   0;
  b3 = barycentre(pt, v3, v1) <   0;

  return ((b1 == b2)  &&  (b2 == b3));
}

Powered by WordPress