c# - Checking if a point is on a line in 3 dimensions -
this method supposed tell if point on given line or not. currently, works fine long no component of direction vector 0 (i using parametric representation of line). no 0, should xresult=yresult=zresult if point on line. if there 0 in direction vector, @ to the lowest degree 1 of 3 0 , hence not equal of others, point still on line.
what best way handle 0 case finding if point on given line?
/// <summary> /// returns true if passed point on line, false otherwise /// </summary> /// <param name="passedpoint"></param> /// <returns></returns> public boolean isonline(line passedline) { boolean pointisonline = false; //get components of point dimension xpoint = new dimension(dimensiontype.millimeter, x.millimeters); dimension ypoint = new dimension(dimensiontype.millimeter, y.millimeters); dimension zpoint = new dimension(dimensiontype.millimeter, z.millimeters); //get components of base of operations point of line dimension xbasepoint = new dimension(dimensiontype.millimeter, passedline.basepoint.x.millimeters); dimension ybasepoint = new dimension(dimensiontype.millimeter, passedline.basepoint.y.millimeters); dimension zbasepoint = new dimension(dimensiontype.millimeter, passedline.basepoint.z.millimeters); //find difference between passed point , base of operations point dimension xdifference = xpoint - xbasepoint; dimension ydifference = ypoint - ybasepoint; dimension zdifference = zpoint - zbasepoint; dimensiongenerator dg = new dimensiongenerator(dimensiontype.millimeter); //instantiate 3 result variables dimension xresult = dg.makedimension(-1); dimension yresult = dg.makedimension(-1); dimension zresult = dg.makedimension(-1); //solve multiplier using each direction , create sure equal. //if component of direction vector 0, result 0 , should hence straight assigned 0 avoid dividing 0 if(passedline.xcomponentofdirection.millimeters == 0) { xresult = dg.makedimension(0); } if(passedline.ycomponentofdirection.millimeters == 0) { yresult = dg.makedimension(0); } if(passedline.zcomponentofdirection.millimeters == 0) { zresult = dg.makedimension(0); } else { xresult = dg.makedimension(xdifference.millimeters / passedline.xcomponentofdirection.millimeters); yresult = dg.makedimension(ydifference.millimeters / passedline.ycomponentofdirection.millimeters); zresult = dg.makedimension(zdifference.millimeters / passedline.zcomponentofdirection.millimeters); } //if 3 results equal, point on line. if not, point not on line. if (xresult == yresult && xresult == zresult) { pointisonline = true; } else { pointisonline = false; } homecoming pointisonline;
if dealing inexact numbers, comparing equality bad idea. i'd seek next approach: take vector base of operations point of line point, , take direction vector of line. compute cross product. if point lies on line, 2 vectors collinear, , cross product 0 vector. compute squared length of vector (to avoid unneccessary square root) , if falls below threshold, point lies on line in question.
but if want remain closer own code, notice have 3 if followed single else. else block still executed if 1 of first conditions applies. that's causing trouble. note if computation in millimeters, might save lot of code dealing in raw numbers instead.
c# geometry line point
No comments:
Post a Comment