# Intersection between point and plane in 3D or more

**URL:** <https://discourse.processing.org/t/intersection-between-point-and-plane-in-3d-or-more/10780>\
**Category:** Coding Questions\
**Created:** [April 30, 2019, 10:47am UTC](https://discourse.processing.org/t/intersection-between-point-and-plane-in-3d-or-more/10780 "2019-04-30T10:47:09Z")\
**Posts on this page:** 16\
**Page:** 1

<div class="post-metadata">

**Author:** ![Stanlepunk](https://yyz2.discourse-cdn.com/flex036/user_avatar/discourse.processing.org/stanlepunk/32/11509_2.png) [@Stanlepunk](https://discourse.processing.org/u/Stanlepunk)\
**Post date:** [April 30, 2019, 10:47am UTC](https://discourse.processing.org/t/intersection-between-point-and-plane-in-3d-or-more/10780/1 "2019-04-30T10:47:09Z")

</div>

I try to find a way to know if a 3D point is in a 3D plane or not, but I don’t find a clear topic to do that in Java or in Processing. If any body have a topic or code to do that I’m very interesting.

Topics about 3D intersection, but my math and code level is very too cheap to understand what I must do ☹  
[http://paulbourke.net/geometry/pointlineplane/](http://paulbourke.net/geometry/pointlineplane/)  
[http://geomalgorithms.com/a06-\_intersect-2.html](http://geomalgorithms.com/a06-_intersect-2.html)  
[https://math.stackexchange.com/questions/83990/line-and-plane-intersection-in-3d](https://math.stackexchange.com/questions/83990/line-and-plane-intersection-in-3d)  
[https://rosettacode.org/wiki/Find\_the\_intersection\_of\_a\_line\_with\_a\_plane#Java](https://rosettacode.org/wiki/Find_the_intersection_of_a_line_with_a_plane#Java)

in 2D [http://www.jeffreythompson.org/collision-detection/poly-point.php](http://www.jeffreythompson.org/collision-detection/poly-point.php)

may be something in this code [https://www.openprocessing.org/sketch/470615](https://www.openprocessing.org/sketch/470615)

My empty code :

```auto
void setup() {
  size(125,125,P3D);
// a, b , c define the plane
  PVector a = new PVector(35,60,4);
  PVector b = new PVector(40,45,9);
  PVector c = new PVector(10,23,45);
  
  PVector any = new PVector(1,2,3);
  
  println(in_plane(a,b,c,any));
  println(in_poly(a,b,c,any));
}

boolean in_plane(PVector a, PVector b, PVector c , PVector any) {
  boolean in_plane_is = false;
  // no idea what I must write here ????
  return in_plane_is;
}

boolean in_poly(PVector a, PVector b, PVector c , PVector any) {
  boolean in_poly_is = false;
  // no idea what I must write here ????
  return in_poly_is;
}

```

---

<div class="post-metadata">

**Author:** ![kll](https://yyz2.discourse-cdn.com/flex036/user_avatar/discourse.processing.org/kll/32/964_2.png) [@kll](https://discourse.processing.org/u/kll)\
**Post date:** [April 30, 2019, 11:57am UTC](https://discourse.processing.org/t/intersection-between-point-and-plane-in-3d-or-more/10780/2 "2019-04-30T11:57:54Z")

</div>

sounds like some good math needed ( and possibly above my level )  
but a other small thing i can help you with:  
show something:

```auto
//https://discourse.processing.org/t/intersection-between-point-and-plane-in-3d-or-more/10780

PVector a, b, c, any;

void setup() {
  size(200, 200, P3D);
  a = new PVector(35, 60, 4);
  b = new PVector(40, 45, 9);
  c = new PVector(10, 23, 45);

  any = new PVector(10, 20, 30);

  info_print(); // Tab ptz
}

void draw () {
  background(200, 200, 0);
  PTZ();
}

// _____________________________________________________
void draw_object() { // called by / from inside ptz
  axis();
  show_sphere();
} 

void axis() {
  int max = 100;
  stroke(200, 0, 0);
  line(0, 0, 0, max, 0, 0);
  stroke(0, 200, 0);
  line(0, 0, 0, 0, max, 0);
  stroke(0, 0, 200);
  line(0, 0, 0, 0, 0, max);
}
void show_sphere() {
  fill(200, 0, 200);
  noStroke();
  push();
  translate(a.x, a.y, a.z);
  sphere(3);
  pop();
  push();
  translate(b.x, b.y, b.z);
  sphere(3);
  pop();
  push();
  translate(c.x, c.y, c.z);
  sphere(3);
  pop();
  push();
  translate(any.x, any.y, any.z);
  fill(0, 200, 200);
  sphere(3);
  pop();
  stroke(200, 0, 200);
  line(a.x, a.y, a.z, b.x, b.y, b.z);
  line(b.x, b.y, b.z, c.x, c.y, c.z);
  line(c.x, c.y, c.z, a.x, a.y, a.z);
}

/*

 
 println("in_plane: "+in_plane(a, b, c, any));
 println("in_poly: "+in_poly(a, b, c, any));
 
 
 boolean in_plane(PVector a, PVector b, PVector c, PVector any) {
 boolean in_plane_is = false;
 // no idea what I must write here ????
 return in_plane_is;
 }
 
 
 boolean in_poly(PVector a, PVector b, PVector c, PVector any) {
 boolean in_poly_is = false;
 // no idea what I must write here ????
 return in_poly_is;
 }
 
 */

// tab ptz
int mode = 0;
float Zmag = 2;
int Zaxis=-100;                                                       
float Xmag, Ymag = 0;
float newXmag, newYmag = 0; 
int newZmag = 0;
float newxpos, newypos = 0; // for PAN
float xposd, yposd = 0; // for PAN

// _________________________________________________________________ ROTATE / TILDE and MOVE / PAN
void mousePressed() {
  if (mouseButton == LEFT) mode=1; // ORBIT
  else if (mouseButton == RIGHT) mode=2; // PAN
  // else if (mouseButton == CENTER) mode=3; // zoom mouse wheel
}

// _________________________________________________________________ mouse PT end
void mouseReleased() { 
  mode = 0;
}

// _________________________________________________________________ mouseWheel ZOOM
void mouseWheel(MouseEvent event) {
  float e = event.getCount();
  //println(e);
  if ( !keyPressed ) {
    float newZmag = event.getCount()/3.0; 
    Zmag += newZmag;
    //println("mouse event: "+newZmag+" Zmag "+Zmag);
  }
}

// _______________________________________________ OPERATION
void keyPressed() {
  if ( keyCode == UP ) Ymag -= 0.1 ;
  if ( keyCode == DOWN ) Ymag += 0.1 ; 
  if ( keyCode == RIGHT) Xmag -= 0.1 ; 
  if ( keyCode == LEFT ) Xmag += 0.1 ;
  if ( keyCode == 16 ) Zmag -= 0.2 ; // [Page Down]
  if ( keyCode == 11 ) Zmag += 0.2 ; // [Page Up]
  //println("key: "+key); println("keyCode: "+keyCode);
}

// _______________________________________________
void keyReleased() { }

// ________________________________________________ Pan Tilde Zoom
void PTZ() {
  pushMatrix(); 
  translate(width/2, height/2, Zaxis);
  // get new mouse operation  
  if ( mode == 2 ) { // PAN ( right mouse button pressed)
    xposd = (mouseX-float(width/2));
    yposd = (mouseY-float(height/2));
  }  
  newxpos = xposd;// xposd=0;
  newypos = yposd;// yposd = 0; 
  translate(newxpos, newypos, 0); // move object
  if ( mode == 1 ) { // ORBIT ( left mouse button pressed)
    newXmag = mouseX/float(width) * TWO_PI;
    newYmag = mouseY/float(height) * TWO_PI;

    float diff = Xmag-newXmag;
    if (abs(diff) > 0.01) Xmag -= diff/4.0;
    diff = Ymag-newYmag;
    if (abs(diff) > 0.01) Ymag -= diff/4.0;
  }
  rotateX(-Ymag);   
  rotateY(-Xmag);   
  scale(Zmag);
  draw_object(); // THE OBJECT
  popMatrix();
}

// _______________________________________________ SETUP PRINT INFO
void info_print() {
  println("PTZ info:");
  println("key UP DOWN RIGHT LEFT -> rotate // key PAGE UP DOWN -> zoom");
  println("mouse LEFT press drag up down right left -> rotate");
  println("mouse RIGHT press -> move ");
  println("mouse WHEEL turn -> zoom");
}
// _______________________________________________

```

![SNAG-0098](https://canada1.discourse-cdn.com/flex036/uploads/processingfoundation1/original/2X/d/d45c341f5cad5afe621c2036fa046e82001a6378.jpeg)

---

<div class="post-metadata">

**Author:** ![Stanlepunk](https://yyz2.discourse-cdn.com/flex036/user_avatar/discourse.processing.org/stanlepunk/32/11509_2.png) [@Stanlepunk](https://discourse.processing.org/u/Stanlepunk)\
**Post date:** [April 30, 2019, 12:49pm UTC](https://discourse.processing.org/t/intersection-between-point-and-plane-in-3d-or-more/10780/3 "2019-04-30T12:49:02Z")

</div>

That’s not solve my problem but I love your code, the camera is very good ! thx for trick

---

<div class="post-metadata">

**Author:** ![kll](https://yyz2.discourse-cdn.com/flex036/user_avatar/discourse.processing.org/kll/32/964_2.png) [@kll](https://discourse.processing.org/u/kll)\
**Post date:** [April 30, 2019, 12:54pm UTC](https://discourse.processing.org/t/intersection-between-point-and-plane-in-3d-or-more/10780/4 "2019-04-30T12:54:02Z")

</div>

> [@Stanlepunk](#):
>
> That’s not solve my problem

i know, still looking,  
checked already 2 links you posted, but are definitely 2D only

---

<div class="post-metadata">

**Author:** ![quark](https://yyz2.discourse-cdn.com/flex036/user_avatar/discourse.processing.org/quark/32/26_2.png) [@quark](https://discourse.processing.org/u/quark)\
**Post date:** [April 30, 2019, 3:20pm UTC](https://discourse.processing.org/t/intersection-between-point-and-plane-in-3d-or-more/10780/5 "2019-04-30T15:20:49Z")

</div>

I have done the is\_on\_plane bit. When you say is in poly I assume you mean in the plane and inside the triangle made by a,b,c - please confirm.

```auto
PVector a, b, c, any;

void setup() {
  size(125, 125, P3D);
  // a, b , c define the plane
  a = new PVector(35, 60, 4);
  b = new PVector(40, 45, 9);
  c = new PVector(10, 23, 45);
  // The center of abc as it must be on the plane
  any = getCenter(a, b, c);
  // Try modifying PVector any to test in_plane 
  any.x += 0.1;
  println(any);
  //println(getPlaneNormal(a, b, c));

  println(in_plane(a, b, c, any));
  //println(in_poly(a, b, c, any));
}

PVector getCenter(PVector a, PVector b, PVector c) {
  PVector center = new PVector(a.x + b.x + c.x, a.y + b.y + c.y, a.z + b.z + c.z);
  return center.div(3);
}

PVector getPlaneNormal(PVector a, PVector b, PVector c) {
  return (PVector.sub(a, c).cross(PVector.sub(b, c))).normalize();
}

boolean in_plane(PVector a, PVector b, PVector c, PVector any) {
  PVector n = getPlaneNormal(a, b, c);
  // Calculate nearest distance between the plane represented by the vectors
  // a,b and c, and the point any
  float d = n.x*any.x + n.y*any.y + n.z*any.z - n.x*a.x - n.y*a.y - n.z*a.z;
  // A perfect resuult would be d==0 but this will not hapen with realistic
  // float data so the smaller d the closer the point. Here I have decided
  // the point is on the plane if the distance is less than 1 uint.
  return abs(d) < 1.0;
}

boolean in_poly(PVector a, PVector b, PVector c, PVector any) {
  boolean in_poly_is = false;
  // no idea what I must write here ????
  return in_poly_is;
}

```

---

<div class="post-metadata">

**Author:** ![BennyHacker](https://yyz2.discourse-cdn.com/flex036/user_avatar/discourse.processing.org/bennyhacker/32/2969_2.png) [@BennyHacker](https://discourse.processing.org/u/BennyHacker)\
**Post date:** [April 30, 2019, 3:30pm UTC](https://discourse.processing.org/t/intersection-between-point-and-plane-in-3d-or-more/10780/6 "2019-04-30T15:30:31Z")

</div>

If you already have the intersection and are trying to to find out if the intersection actually lies within the 3 points that define the plane, one easy solution is checking the area formed by the three triangles and comparing that with the original area

for a more complicated shape: divide the shape into triangles and test for each triangle ![example6](https://canada1.discourse-cdn.com/flex036/uploads/processingfoundation1/original/2X/d/d039bde89ba1d262f3907656dd1c274f0d248a9c.png)

I should mention that A+B+C may never be exactly equal to area(a,b,c), so you should check within a small margin

---

<div class="post-metadata">

**Author:** ![kll](https://yyz2.discourse-cdn.com/flex036/user_avatar/discourse.processing.org/kll/32/964_2.png) [@kll](https://discourse.processing.org/u/kll)\
**Post date:** [May 1, 2019, 7:35am UTC](https://discourse.processing.org/t/intersection-between-point-and-plane-in-3d-or-more/10780/7 "2019-05-01T07:35:15Z")

</div>

so, also play little bit more

-a- using a axis transformation with following idea

- move axis so point a is center

- rotate point b is on x axis in 2 rotation steps

- rotate point c so it is in x y plane ( z == 0 )

- 
  - ( now the x-y plane is the triangle plane )

- how to check if the point d is in the plane?  
if ( d.z == 0 )

note: for all above axis translations it must be done for all 4 points to work.

add, the 3 rotations are not possible with PVector.rotate(angle) in 3D  
to use it anyway i hack that by using always only 2 axis, looks bad… but seem to work.

now all comes with the show  
you can follow each of the transformations by key [n] next key [p] prev

-b- found some code for point inside triangle  
[https://stackoverflow.com/questions/2049582/how-to-determine-if-a-point-is-in-a-2d-triangle](https://stackoverflow.com/questions/2049582/how-to-determine-if-a-point-is-in-a-2d-triangle) , what says it is for 2D ( and i did not fully check … )

have fun:

```auto
//https://discourse.processing.org/t/intersection-between-point-and-plane-in-3d-or-more/10780

PVector a, b, c, d; // abc triangle and checkpoint d
PVector at1, bt1, ct1, dt1; // after trans 1
PVector at2, bt2, ct2, dt2; // after trans 2
PVector at3, bt3, ct3, dt3; // after trans 3
PVector at4, bt4, ct4, dt4; // after trans 4
int step = 0;
boolean dprint = true, dinplane = false, dintriangle = false;

void setup() {
  size(500, 500, P3D);
  // triangle / plane
  a = new PVector(35, 60, 4);
  b = new PVector(40, 45, 9);
  c = new PVector(10, 23, 45);
  // check point
  d = new PVector(1, 2, 3);
  /*
  // test
   a = new PVector(35, 60, 0);
   b = new PVector(40, 20, 0);
   c = new PVector(10, 23, 0);
   // check point
   d = new PVector(30, 40, 0);
   */

  info_print(); // Tab ptz
  println("here add: key [n] next step, [p] prev step");
}

void draw () {
  background(200, 200, 0);
  PTZ();
}

// _____________________________________________________
void draw_object() { // called by / from inside ptz
  axis();
  show_sphere();
  trans();
} 

void trans() {
  // axis transform step 1 move a to 0
  at1 = a.copy().sub(a);
  bt1 = b.copy().sub(a);
  ct1 = c.copy().sub(a);
  dt1 = d.copy().sub(a);

  // axis transform step 2 rotate b ( by y ) to x axis first step
  float angby = -1.0*new PVector(bt1.x, bt1.y, 0).heading(); 
  at2 = new PVector(at1.x, at1.y);
  at2.rotate(angby);
  at2.set(at2.x, at2.y, at1.z);

  bt2 = new PVector(bt1.x, bt1.y);
  bt2.rotate(angby);
  bt2.set(bt2.x, bt2.y, bt1.z);

  ct2 = new PVector(ct1.x, ct1.y);
  ct2.rotate(angby);
  ct2.set(ct2.x, ct2.y, ct1.z);

  dt2 = new PVector(dt1.x, dt1.y);
  dt2.rotate(angby);
  dt2.set(dt2.x, dt2.y, dt1.z);

  // axis transform step 3 rotate b ( by z ) to x axis second step
  float angbz = -1.0*new PVector(bt2.x, bt2.z, 0).heading(); 
  at3 = new PVector(at2.x, at2.z);
  at3.rotate(angbz);
  at3.set(at3.x, at2.y, at3.y);

  bt3 = new PVector(bt2.x, bt2.z);
  bt3.rotate(angbz);
  bt3.set(bt3.x, bt2.y, bt3.y);

  ct3 = new PVector(ct2.x, ct2.z);
  ct3.rotate(angbz);
  ct3.set(ct3.x, ct2.y, ct3.y);

  dt3 = new PVector(dt2.x, dt2.z);
  dt3.rotate(angbz);
  dt3.set(dt3.x, dt2.y, dt3.y);

  // axis transform step 4 rotate c ( by x ) to y axis ( so z = 0 )
  float angcz = -1.0*new PVector(ct3.y, ct3.z, 0).heading(); 
  at4 = new PVector(at3.y, at3.z);
  at4.rotate(angcz);
  at4.set(at3.x, at4.x, at4.y);

  bt4 = new PVector(bt3.y, bt3.z);
  bt4.rotate(angcz);
  bt4.set(bt3.x, bt4.x, bt4.y);

  ct4 = new PVector(ct3.y, ct3.z);
  ct4.rotate(angcz);
  ct4.set(ct3.x, ct4.x, ct4.y);

  dt4 = new PVector(dt3.y, dt3.z);
  dt4.rotate(angcz);
  dt4.set(dt3.x, dt4.x, dt4.y);

  show_sphere_trans(step);
  // what was the job? oh yes,
  // is vector d in the plane made by a b c ? easy, d.z must be 0 (but check float problem )
  if ( dprint ) { 
    if ( dt4.z <= 0.01 && dt4.z > -0.01 ) dinplane = true;
    if ( pointInTriangle (dt4, at4, bt4, ct4) ) dintriangle = true;
    println("d_in plane: "+dinplane+" d_in triangle: "+dintriangle);
    dprint = false; // only print one time
  }
}

void show_sphere_trans(int step) {
  PVector as, bs, cs, ds;

  // if ( step == 1 ) {
  fill(0, 200, 100);
  as = new PVector(at1.x, at1.y, at1.z);
  bs = new PVector(bt1.x, bt1.y, bt1.z);
  cs = new PVector(ct1.x, ct1.y, ct1.z);
  ds = new PVector(dt1.x, dt1.y, dt1.z);
  // }
  if ( step == 2 ) {
    fill(0, 100, 200);
    as = new PVector(at2.x, at2.y, at2.z);
    bs = new PVector(bt2.x, bt2.y, bt2.z);
    cs = new PVector(ct2.x, ct2.y, ct2.z);
    ds = new PVector(dt2.x, dt2.y, dt2.z);
  }
  if ( step == 3 ) {
    fill(200, 100, 200);
    as = new PVector(at3.x, at3.y, at3.z);
    bs = new PVector(bt3.x, bt3.y, bt3.z);
    cs = new PVector(ct3.x, ct3.y, ct3.z);
    ds = new PVector(dt3.x, dt3.y, dt3.z);
  }
  if ( step == 4 ) {
    fill(200, 0, 100);
    as = new PVector(at4.x, at4.y, at4.z);
    bs = new PVector(bt4.x, bt4.y, bt4.z);
    cs = new PVector(ct4.x, ct4.y, ct4.z);
    ds = new PVector(dt4.x, dt4.y, dt4.z);
  }
  if ( step > 0) {
    noStroke();
    push();
    translate(as.x, as.y, as.z);
    sphere(3);
    pop();
    push();
    translate(bs.x, bs.y, bs.z);
    sphere(3);
    pop();
    push();
    translate(cs.x, cs.y, cs.z);
    sphere(3);
    pop();
    push();
    translate(ds.x, ds.y, ds.z);
    //fill(200);
    sphere(3);
    pop();
    stroke(200);
    line(as.x, as.y, as.z, bs.x, bs.y, bs.z);
    line(bs.x, bs.y, bs.z, cs.x, cs.y, cs.z);
    line(cs.x, cs.y, cs.z, as.x, as.y, as.z);
  }
  if ( step > 0 && step < 3 ) { // show coords for point b
    stroke(100);
    strokeWeight(0.5);
    line(bs.x, 0, 0, bs.x, bs.y, bs.z); 
    line(0, bs.y, 0, bs.x, bs.y, bs.z); 
    line(0, 0, bs.z, bs.x, bs.y, bs.z);
  }
  if ( step >= 3 ) {
    stroke(100);
    strokeWeight(0.5);
    line(cs.x, 0, 0, cs.x, cs.y, cs.z); 
    line(0, cs.y, 0, cs.x, cs.y, cs.z); 
    line(0, 0, cs.z, cs.x, cs.y, cs.z);
  }
}

void axis() {
  int max = 100;
  stroke(200, 0, 0);
  strokeWeight(1);
  line(0, 0, 0, max, 0, 0);
  strokeWeight(0.3);
  line(0, 0, 0, -max, 0, 0);
  fill(200, 0, 0);
  text("x", max, 0);
  stroke(0, 200, 0);
  strokeWeight(1);
  line(0, 0, 0, 0, max, 0);
  strokeWeight(0.3);
  line(0, 0, 0, 0, -max, 0);
  fill(0, 200, 0);
  text("y", 0, max);
  stroke(0, 0, 200);
  strokeWeight(1);
  line(0, 0, 0, 0, 0, max);
  strokeWeight(0.3);
  line(0, 0, 0, 0, 0, -max);
  fill(0, 0, 200);
  text("z", 0, 0, max);
  fill(100, 100, 0, 10); // trans not work
  noStroke();
  max = 20;
  rect(-max, -max, 2*max, 2*max); // xy plane
}

void show_sphere() {
  fill(200, 0, 200);
  noStroke();
  push();
  translate(a.x, a.y, a.z);
  sphere(3);
  pop();
  push();
  translate(b.x, b.y, b.z);
  sphere(3);
  pop();
  push();
  translate(c.x, c.y, c.z);
  sphere(3);
  pop();
  push();
  translate(d.x, d.y, d.z);
  fill(0, 200, 200);
  sphere(3);
  pop();
  stroke(200, 0, 200);
  line(a.x, a.y, a.z, b.x, b.y, b.z);
  line(b.x, b.y, b.z, c.x, c.y, c.z);
  line(c.x, c.y, c.z, a.x, a.y, a.z);
}

void step_keyPressed() {
  if ( key == 'n' ) {
    step++;
    if ( step > 4 ) step = 0;
    println("step: "+step);
  }
  if ( key == 'p' ) {
    step--;
    if ( step < 0 ) step = 4;
    println("step: "+step);
  }
}

// ok now need some math
// https://stackoverflow.com/questions/2049582/how-to-determine-if-a-point-is-in-a-2d-triangle

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

boolean pointInTriangle (PVector pt, PVector v1, PVector v2, PVector v3)
{
  float d1, d2, d3;
  boolean has_neg, has_pos;

  d1 = sign(pt, v1, v2);
  d2 = sign(pt, v2, v3);
  d3 = sign(pt, v3, v1);

  has_neg = (d1 < 0) || (d2 < 0) || (d3 < 0);
  has_pos = (d1 > 0) || (d2 > 0) || (d3 > 0);

  return !(has_neg && has_pos);
}

// tab ptz
int mode = 0;
float Zmag = 2;
int Zaxis=-100;                                                       
float Xmag, Ymag = 0;
float newXmag, newYmag = 0; 
int newZmag = 0;
float newxpos, newypos = 0; // for PAN
float xposd, yposd = 0; // for PAN

// _________________________________________________________________ ROTATE / TILDE and MOVE / PAN
void mousePressed() {
  if (mouseButton == LEFT) mode=1; // ORBIT
  else if (mouseButton == RIGHT) mode=2; // PAN
  // else if (mouseButton == CENTER) mode=3; // zoom mouse wheel
}

// _________________________________________________________________ mouse PT end
void mouseReleased() { 
  mode = 0;
}

// _________________________________________________________________ mouseWheel ZOOM
void mouseWheel(MouseEvent event) {
  float e = event.getCount();
  //println(e);
  if ( !keyPressed ) {
    float newZmag = event.getCount()/3.0; 
    Zmag += newZmag;
    //println("mouse event: "+newZmag+" Zmag "+Zmag);
  }
}

// _______________________________________________ OPERATION
void keyPressed() {
  if ( keyCode == UP ) Ymag -= 0.1 ;
  if ( keyCode == DOWN ) Ymag += 0.1 ; 
  if ( keyCode == RIGHT) Xmag -= 0.1 ; 
  if ( keyCode == LEFT ) Xmag += 0.1 ;
  if ( keyCode == 16 ) Zmag -= 0.2 ; // [Page Down]
  if ( keyCode == 11 ) Zmag += 0.2 ; // [Page Up]
  //println("key: "+key); println("keyCode: "+keyCode);
  step_keyPressed(); // from main
}

// _______________________________________________
void keyReleased() { }

// ________________________________________________ Pan Tilde Zoom
void PTZ() {
  pushMatrix(); 
  translate(width/2, height/2, Zaxis);
  // get new mouse operation  
  if ( mode == 2 ) { // PAN ( right mouse button pressed)
    xposd = (mouseX-float(width/2));
    yposd = (mouseY-float(height/2));
  }  
  newxpos = xposd;// xposd=0;
  newypos = yposd;// yposd = 0; 
  translate(newxpos, newypos, 0); // move object
  if ( mode == 1 ) { // ORBIT ( left mouse button pressed)
    newXmag = mouseX/float(width) * TWO_PI;
    newYmag = mouseY/float(height) * TWO_PI;

    float diff = Xmag-newXmag;
    if (abs(diff) > 0.01) Xmag -= diff/4.0;
    diff = Ymag-newYmag;
    if (abs(diff) > 0.01) Ymag -= diff/4.0;
  }
  rotateX(-Ymag);   
  rotateY(-Xmag);   
  scale(Zmag);
  draw_object(); // THE OBJECT
  popMatrix();
}

// _______________________________________________ SETUP PRINT INFO
void info_print() {
  println("PTZ info:");
  println("key UP DOWN RIGHT LEFT -> rotate // key PAGE UP DOWN -> zoom");
  println("mouse LEFT press drag up down right left -> rotate");
  println("mouse RIGHT press -> move ");
  println("mouse WHEEL turn -> zoom");
}
// _______________________________________________

```

---

<div class="post-metadata">

**Author:** ![Stanlepunk](https://yyz2.discourse-cdn.com/flex036/user_avatar/discourse.processing.org/stanlepunk/32/11509_2.png) [@Stanlepunk](https://discourse.processing.org/u/Stanlepunk)\
**Post date:** [May 1, 2019, 7:55am UTC](https://discourse.processing.org/t/intersection-between-point-and-plane-in-3d-or-more/10780/8 "2019-05-01T07:55:07Z")

</div>

Thanks a lot, that’s work nice, that’s exactly what I need. And I confirm when I write in poly it’s to know if the point is in the shape or not, it’s like a bonus track 🙂 But the first thing I need, it was to know if a point is in any plane. My final idea is show all points are in a specific plane from a cloud 3D points. I try your solution and show the result when I implemented your soltion in my final sketch.

---

<div class="post-metadata">

**Author:** ![Stanlepunk](https://yyz2.discourse-cdn.com/flex036/user_avatar/discourse.processing.org/stanlepunk/32/11509_2.png) [@Stanlepunk](https://discourse.processing.org/u/Stanlepunk)\
**Post date:** [May 1, 2019, 8:06am UTC](https://discourse.processing.org/t/intersection-between-point-and-plane-in-3d-or-more/10780/9 "2019-05-01T08:06:11Z")

</div>

whaouuuuu you go very very far in the wild wild west that’s awesome, I don’t know yet how to use it… but that very nice !!!

---

<div class="post-metadata">

**Author:** ![quark](https://yyz2.discourse-cdn.com/flex036/user_avatar/discourse.processing.org/quark/32/26_2.png) [@quark](https://discourse.processing.org/u/quark)\
**Post date:** [May 1, 2019, 8:47am UTC](https://discourse.processing.org/t/intersection-between-point-and-plane-in-3d-or-more/10780/10 "2019-05-01T08:47:44Z")

</div>

OK so I have now added the in\_poly code 😄

```auto
PVector a, b, c, any;

void setup() {
  size(125, 125, P3D);
  // a, b , c define the plane
  a = new PVector(35, 60, 4);
  b = new PVector(40, 45, 9);
  c = new PVector(10, 23, 45);
  // The center of abc as it must be on the plane
  any = getCenter(a, b, c);

  println("Is in plane : " + in_plane(a, b, c, any));
  println("Is in poly : " + in_poly(a, b, c, any));
}

PVector getCenter(PVector a, PVector b, PVector c) {
  PVector center = new PVector(a.x + b.x + c.x, a.y + b.y + c.y, a.z + b.z + c.z);
  return center.div(3);
}

PVector getPlaneNormal(PVector a, PVector b, PVector c) {
  return (PVector.sub(a, c).cross(PVector.sub(b, c))).normalize();
}

boolean in_plane(PVector a, PVector b, PVector c, PVector any) {
  PVector n = getPlaneNormal(a, b, c);
  // Calculate nearest distance between the plane represented by the vectors
  // a,b and c, and the point any
  float d = n.x*any.x + n.y*any.y + n.z*any.z - n.x*a.x - n.y*a.y - n.z*a.z;
  // A perfect resuult would be d==0 but this will not hapen with realistic
  // float data so the smaller d the closer the point. Here I have decided
  // the point is on the plane if the distance is less than 1 uint.
  return abs(d) < 1.0;
}

/**
 If a point in inside a triangle then the sum of the 3 internal angles
 will be 2Pi radians (360 degrees). This method calculates the sum of the
 internal angles and compares this with 2Pi radians.
 */
boolean in_poly(PVector a, PVector b, PVector c, PVector any) {
  // Since Processing uses floats rather than doubles the chance of 
  // getting Float.NaN (not-a-number) is high if we don't normalise
  // the vectors before calculating the arc-cosine
  PVector a_any = PVector.sub(a, any).normalize();
  PVector b_any = PVector.sub(b, any).normalize();
  PVector c_any = PVector.sub(c, any).normalize();
  float s = abs(
    acos(PVector.dot(a_any, b_any)) 
    + acos(PVector.dot(b_any, c_any)) 
    + acos(PVector.dot(c_any, a_any))
    - TWO_PI);
  // A perfect resuult would be s==0 but this will not hapen with realistic
  // float data so the closer d is to zero the better. Here I have decided
  // the point is in the triangle if s is less than 1 thousandth of a 
  // radian.
  return s < 1E-3;
}

```

---

<div class="post-metadata">

**Author:** ![Stanlepunk](https://yyz2.discourse-cdn.com/flex036/user_avatar/discourse.processing.org/stanlepunk/32/11509_2.png) [@Stanlepunk](https://discourse.processing.org/u/Stanlepunk)\
**Post date:** [May 1, 2019, 9:08am UTC](https://discourse.processing.org/t/intersection-between-point-and-plane-in-3d-or-more/10780/11 "2019-05-01T09:08:55Z")

</div>

Thanks I feel i can code nice tool now !  
here the result of any plane detection in any points of cloud !

 ![43](https://canada1.discourse-cdn.com/flex036/uploads/processingfoundation1/original/2X/7/71eaa1be9b9aa62b2bb493c38ae1373cdcb9ccc4.png)

---

<div class="post-metadata">

**Author:** ![Stanlepunk](https://yyz2.discourse-cdn.com/flex036/user_avatar/discourse.processing.org/stanlepunk/32/11509_2.png) [@Stanlepunk](https://discourse.processing.org/u/Stanlepunk)\
**Post date:** [May 1, 2019, 9:11am UTC](https://discourse.processing.org/t/intersection-between-point-and-plane-in-3d-or-more/10780/12 "2019-05-01T09:11:47Z")

</div>

> [@quark](#):
>
> 1E-3

what is it, it’s weird value, it’s like a very very very small value ?

---

<div class="post-metadata">

**Author:** ![jb4x](https://yyz2.discourse-cdn.com/flex036/user_avatar/discourse.processing.org/jb4x/32/789_2.png) [@jb4x](https://discourse.processing.org/u/jb4x)\
**Post date:** [May 1, 2019, 9:15am UTC](https://discourse.processing.org/t/intersection-between-point-and-plane-in-3d-or-more/10780/13 "2019-05-01T09:15:01Z")

</div>

This is the “scientific way” of writing 1\*10^(-3 ) so 0.001

You can read more about it here:  
[https://en.wikipedia.org/wiki/Scientific\_notation#E\_notation](https://en.wikipedia.org/wiki/Scientific_notation#E_notation)

---

<div class="post-metadata">

**Author:** ![Stanlepunk](https://yyz2.discourse-cdn.com/flex036/user_avatar/discourse.processing.org/stanlepunk/32/11509_2.png) [@Stanlepunk](https://discourse.processing.org/u/Stanlepunk)\
**Post date:** [May 1, 2019, 9:17am UTC](https://discourse.processing.org/t/intersection-between-point-and-plane-in-3d-or-more/10780/14 "2019-05-01T09:17:46Z")

</div>

hmm interesting, so if I want write `0,00000000001` i can simply write `1E-12` ?

---

<div class="post-metadata">

**Author:** ![quark](https://yyz2.discourse-cdn.com/flex036/user_avatar/discourse.processing.org/quark/32/26_2.png) [@quark](https://discourse.processing.org/u/quark)\
**Post date:** [May 1, 2019, 9:18am UTC](https://discourse.processing.org/t/intersection-between-point-and-plane-in-3d-or-more/10780/15 "2019-05-01T09:18:51Z")

</div>

Yes but if you make the value too small then no points will be found in the poly.

---

<div class="post-metadata">

**Author:** ![Stanlepunk](https://yyz2.discourse-cdn.com/flex036/user_avatar/discourse.processing.org/stanlepunk/32/11509_2.png) [@Stanlepunk](https://discourse.processing.org/u/Stanlepunk)\
**Post date:** [May 1, 2019, 9:23am UTC](https://discourse.processing.org/t/intersection-between-point-and-plane-in-3d-or-more/10780/16 "2019-05-01T09:23:14Z")

</div>

Claro, it’s just for my general knowledge, because i use often a very small value to multiply the `frameCount` and i have a lot `000000000` with your notation is clearer ! I learn a lot thing the 1st May… love this working day party !
