«Geometry classes» by olafhochherz
on 25 Feb'13 12:03 inThis are Classes I am working on to develop a nice Geometry Quark ... one day ... a you need VectorSpace Quark for this
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
LineND{
var <>positionVector,<>directionVector,<>segment;
*new { arg positionVector,directionVector,segment=false;
^super.newCopyArgs(positionVector,directionVector,segment);
}
*newUsingPoints{arg positionVector1,positionVector2,segment=false;
^super.newCopyArgs(positionVector1,(positionVector2-positionVector1),segment);
}
projectPoint2Line{arg aPoint;
^positionVector+directionVector.proj(aPoint-positionVector);
}
projectPoint2Segment{arg aPoint;
var cp=positionVector+directionVector.proj(aPoint-positionVector);
var o=LineND(aPoint,cp-aPoint);
^this.intersection(o);
}
isOrthogonal{arg aLine; ^directionVector.isOrthogonal(aLine.directionVector);}
isParallel{arg aLine;
var a=this.directionVector.angle(aLine.directionVector);
if((a==pi)||(a==0),{^true},{^false});
}
skewLinesNearestPoints{arg aLine;
var p1 = this.positionVector;
var p2 = aLine.positionVector;
var d1 = this.directionVector;
var d2 = aLine.directionVector;
var delta = (sum(d1**2)*sum(d2**2)) - ((d1 <|> d2)**2);
var delta1 = ((d2<|> (p1-p2)) * (d1<|> d2)) - ((d1<|> (p1-p2)) * sum(d2**2));
var delta2 = ((d2<|> (p1-p2)) * sum(d1**2)) - ((d1<|> d2) * (d1<|> (p1-p2)));
var t1 = delta1 / delta;
var t2 = delta2 / delta;
if (this.segment, {
t1=t1.min(1).max(0);
});
if (aLine.segment, {
t2.min(1).max(0);
});
^[p1+(t1*d1), p2+(t2*d2)];
}
intersection{arg aLine;
var p1,p2;
#p1,p2 = this.skewLinesNearestPoints(aLine);
if(p1.dist(p2)<0.00001,{^p1},{^false});
}
prPointAt{arg index,value;
var r=(value/directionVector[index])-(positionVector[index]/directionVector[index]);
^this.getPointOnLine(r);
}
getPointOnLine{arg s;
^(this.positionVector+(s*this.directionVector));
}
}
Plane{
var <>positionVector,<>spanA,<>spanB;
*new { arg positionVector,spanA,spanB;
^super.newCopyArgs(positionVector,
spanA,
spanB)
}
*newUsingPoints{arg positionVector1,positionVector2,positionVector3;
^super.newCopyArgs(positionVector1,
(positionVector2-positionVector1),
(positionVector3-positionVector1));
}
prProjectionScalars{arg aPoint;
var d1 = this.spanA;
var d2 = this.spanB;
var bp = this.positionVector;
var a = sum(d1**2);
var b = (d1<|> d2);
var d = b;
var e = sum(d2**2);
var c = ((aPoint-bp) <|> d1);
var f = ((aPoint-bp) <|> d2);
var delta = (a*e)-(b*d) + 0.0;
var alpha = ((c*e)-(b*f)) / delta;
var beta = ((a*f)-(c*d))/delta;
^[alpha,beta]
}
projectionPoint2Plane{arg aPoint;
var alpha,beta;
#alpha,beta=this.prProjectionScalars(aPoint);
^(this.positionVector + (alpha * this.spanA) + (beta * this.spanB));
}
//TODO
//isCrossing{arg aLine;}
//isParallel{arg aPlane;}
//isOrthogonal{arg aLine;}
//crossingPoint{arg aLine;}//returns a positionVector;
//crossingLine{arg aPlane;}//returns a LineND
}
reception
comments