{
   "description" : "This are Classes I am working on to develop a nice Geometry Quark ... one day ... a you need VectorSpace Quark for this",
   "ancestor_list" : [],
   "author" : "olafhochherz",
   "name" : "Geometry classes",
   "code" : "LineND{\r\n\tvar <>positionVector,<>directionVector,<>segment;\r\n\t*new { arg positionVector,directionVector,segment=false;\r\n\t\t^super.newCopyArgs(positionVector,directionVector,segment);\r\n\t}\r\n\t*newUsingPoints{arg positionVector1,positionVector2,segment=false;\r\n\t\t^super.newCopyArgs(positionVector1,(positionVector2-positionVector1),segment);\r\n\t}\r\n\r\n\tprojectPoint2Line{arg aPoint;\r\n\t\t^positionVector+directionVector.proj(aPoint-positionVector);\r\n\t}\r\n\tprojectPoint2Segment{arg aPoint;\r\n\t\tvar cp=positionVector+directionVector.proj(aPoint-positionVector);\r\n\t\tvar o=LineND(aPoint,cp-aPoint);\r\n\t\t^this.intersection(o);\r\n\t}\r\n\r\n\tisOrthogonal{arg aLine; ^directionVector.isOrthogonal(aLine.directionVector);}\r\n\r\n\tisParallel{arg aLine;\r\n\t\tvar a=this.directionVector.angle(aLine.directionVector);\r\n\t\tif((a==pi)||(a==0),{^true},{^false});\r\n\t}\r\n\r\n\tskewLinesNearestPoints{arg aLine;\r\n\t\tvar p1 = this.positionVector;\r\n\t\tvar p2 =  aLine.positionVector;\r\n\t\tvar d1 = this.directionVector;\r\n\t\tvar d2 =  aLine.directionVector;\r\n\t\tvar delta = (sum(d1**2)*sum(d2**2)) - ((d1 <|> d2)**2);\r\n\t\tvar delta1 = ((d2<|> (p1-p2)) * (d1<|> d2)) - ((d1<|> (p1-p2)) * sum(d2**2));\r\n\t\tvar delta2 = ((d2<|> (p1-p2)) * sum(d1**2)) - ((d1<|> d2) * (d1<|> (p1-p2)));\r\n\t\tvar t1 = delta1 / delta;\r\n\t\tvar t2 = delta2 / delta;\r\n\r\n\r\n\t\tif (this.segment, {\r\n\t\t\tt1=t1.min(1).max(0);\r\n\t\t});\r\n\t\tif (aLine.segment, {\r\n\t\t\tt2.min(1).max(0);\r\n\t\t});\r\n\t\t^[p1+(t1*d1), p2+(t2*d2)];\r\n\t}\r\n\r\n\tintersection{arg aLine;\r\n\t\tvar p1,p2;\r\n\t\t#p1,p2 = this.skewLinesNearestPoints(aLine);\r\n\t\tif(p1.dist(p2)<0.00001,{^p1},{^false});\r\n\t}\r\n\r\n\tprPointAt{arg index,value;\r\n\t\tvar r=(value/directionVector[index])-(positionVector[index]/directionVector[index]);\r\n\t\t^this.getPointOnLine(r);\r\n\t}\r\n\r\n\tgetPointOnLine{arg s;\r\n\t\t^(this.positionVector+(s*this.directionVector));\r\n\t}\r\n}\r\n\r\nPlane{\r\n\tvar <>positionVector,<>spanA,<>spanB;\r\n\t*new { arg positionVector,spanA,spanB;\r\n\t\t^super.newCopyArgs(positionVector,\r\n\t\t\tspanA,\r\n\t\t\tspanB)\r\n\t}\r\n\r\n\t*newUsingPoints{arg positionVector1,positionVector2,positionVector3;\r\n\t\t^super.newCopyArgs(positionVector1,\r\n\t\t\t(positionVector2-positionVector1),\r\n\t\t\t(positionVector3-positionVector1));\r\n\t}\r\n\r\n\tprProjectionScalars{arg aPoint;\r\n\t\tvar d1 = this.spanA;\r\n\t\tvar\td2 = this.spanB;\r\n\t\tvar bp = this.positionVector;\r\n\t\tvar  a = sum(d1**2);\r\n\t\tvar  b = (d1<|> d2);\r\n\t\tvar  d = b;\r\n\t\tvar  e = sum(d2**2);\r\n\t\tvar  c = ((aPoint-bp) <|> d1);\r\n\t\tvar  f =  ((aPoint-bp) <|> d2);\r\n\t\tvar delta = (a*e)-(b*d) + 0.0;\r\n\t\tvar alpha = ((c*e)-(b*f)) / delta;\r\n\t\tvar beta = ((a*f)-(c*d))/delta;\r\n\t\t^[alpha,beta]\r\n\t}\r\n\r\n\tprojectionPoint2Plane{arg aPoint;\r\n\t\tvar alpha,beta;\r\n\t\t#alpha,beta=this.prProjectionScalars(aPoint);\r\n\t\t^(this.positionVector + (alpha * this.spanA) + (beta * this.spanB));\r\n\t}\r\n\r\n\t//TODO\r\n\t//isCrossing{arg aLine;}\r\n\t//isParallel{arg aPlane;}\r\n\t//isOrthogonal{arg aLine;}\r\n\t//crossingPoint{arg aLine;}//returns a positionVector;\r\n\t//crossingLine{arg aPlane;}//returns a LineND\r\n}",
   "id" : "1-4Sx",
   "is_private" : null,
   "labels" : [
      "class",
      "line",
      "plane",
      "geometry"
   ]
}
