/* Copyright 2006 Rene Grothmann, modified by Eric Hakenholz This file is part of C.a.R. software. C.a.R. is a free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3 of the License. C.a.R. is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ package rene.zirkel.objects; import rene.zirkel.construction.Construction; import rene.zirkel.structures.Coordinates; // file: IntersectionObject.java public class LineIntersectionObject extends IntersectionObject { public LineIntersectionObject(final Construction c, final PrimitiveLineObject P1, final PrimitiveLineObject P2) { super(c, P1, P2); validate(); } @Override public void updateCircleDep() { ((PrimitiveLineObject) P1).addDep(this); ((PrimitiveLineObject) P2).addDep(this); } @Override public void validate() { if(!P1.valid() || !P2.valid()) { Valid = false; } else { Valid = true; } if(!Valid) { return; } final Coordinates coord = PrimitiveLineObject.intersect((PrimitiveLineObject) P1, (PrimitiveLineObject) P2); if(coord == null) { Valid = false; return; } setXY(coord.X, coord.Y); if(Restricted) { if (!((PrimitiveLineObject) P1).contains(X, Y)) Valid = false; else if(!((PrimitiveLineObject) P2).contains(X, Y)) { Valid = false; } } /** * En 3D * * On veut résoudre le système : (dans le membre de gauche l'équation de P1, dans celui de droite, l'équation de P2) * x1 + a1s = x2 + a2t * y1 + b1s = y2 + b2t * z1 + c1s = z2 + c2t * * où (x1;y1;z1) est un point de P1 et (x2;y2;z2) un point de P2 * et (a1;b1;c1) est un vd de P1 et (a2;b2;c2) est un vd de P2 * * Ce système est équivalent à : * a1s - a2t = x2 - x1 (L1) * b1s - b2t = y2 - y1 (L2) * c1s - c2t = z2 - z1 (L3) */ try { if(((PrimitiveLineObject) P1).getP1().is3D() && ((PrimitiveLineObject) P2).getP1().is3D()) { double x1 = ((PrimitiveLineObject) P1).getP1().getX3D(); double y1 = ((PrimitiveLineObject) P1).getP1().getY3D(); double z1 = ((PrimitiveLineObject) P1).getP1().getZ3D(); double x2 = ((PrimitiveLineObject) P2).getP1().getX3D(); double y2 = ((PrimitiveLineObject) P2).getP1().getY3D(); double z2 = ((PrimitiveLineObject) P2).getP1().getZ3D(); /** * Si P2 ou P2 sont des parallèles, la méthode Pi.getP2() ne renvoie rien. * Pour connaitre un vecteur directeur de P1, il suffit de connaitre * sa parallèle, instance de TwoPointLineObject */ ConstructionObject p1 = P1; if(p1 instanceof ParallelObject) { do{ p1 = ((ParallelObject) p1).getL(); } while(!(p1 instanceof TwoPointLineObject)); } double a1 = ((TwoPointLineObject) p1).getP2().getX3D() - ((TwoPointLineObject) p1).getP1().getX3D(); double b1 = ((TwoPointLineObject) p1).getP2().getY3D() - ((TwoPointLineObject) p1).getP1().getY3D(); double c1 = ((TwoPointLineObject) p1).getP2().getZ3D() - ((TwoPointLineObject) p1).getP1().getZ3D(); ConstructionObject p2 = P2; if(p2 instanceof ParallelObject) { do{ p2 = ((ParallelObject) p2).getL(); } while(!(p2 instanceof TwoPointLineObject)); } double a2 = ((TwoPointLineObject) p2).getP2().getX3D() - ((TwoPointLineObject) p2).getP1().getX3D(); double b2 = ((TwoPointLineObject) p2).getP2().getY3D() - ((TwoPointLineObject) p2).getP1().getY3D(); double c2 = ((TwoPointLineObject) p2).getP2().getZ3D() - ((TwoPointLineObject) p2).getP1().getZ3D(); //(L1) et (L2) double det = -a1*b2 + b1*a2; double dets = -(x2-x1)*b2 + (y2-y1)*a2; double dett = a1*(y2-y1) - b1*(x2-x1); int choice = 1; if(Math.abs(det)<1e-12) { //(L1) et (L3) det = -a1*c2 + c1*a2; dets = -(x2-x1)*c2 + (z2-z1)*a2; dett = a1*(z2-z1) - c1*(x2-x1); choice = 2; } if(Math.abs(det)<1e-12) { //(L2) et (L3) det = -b1*c2 + c1*b2; dets = -(y2-y1)*c2 + (z2-z1)*b2; dett = b1*(z2-z1) - c1*(y2-y1); choice = 3; } double s = dets/det, t = dett/det; if ( (choice==1 && Math.abs(c1*s-c2*t-z2+z1)<1e-12) || (choice==2 && Math.abs(b1*s-b2*t-y2+y1)<1e-12) || (choice==3 && Math.abs(a1*s-a2*t-x2+x1)<1e-12)) { setX3D(x1+a1*s); setY3D(y1+b1*s); setZ3D(z1+c1*s); setIs3D(true); //System.out.println(x1+a1*s); //System.out.println(y1+b1*s); //System.out.println(z1+c1*s); //System.out.println("-------"); setSuperHidden(false); } else { setSuperHidden(true); } } } catch(final Exception ex){} /* if( (P1 instanceof TwoPointLineObject && ((TwoPointLineObject) P1).getP1().is3D()) || (P1 instanceof TwoPointLineObject && ((TwoPointLineObject) P1).getP2().is3D()) || (P2 instanceof TwoPointLineObject && ((TwoPointLineObject) P2).getP1().is3D()) || (P2 instanceof TwoPointLineObject && ((TwoPointLineObject) P2).getP2().is3D())) { try { // Dibs intersection 3D double a1=((TwoPointLineObject) P1).getP1().getX3D(); double b1=((TwoPointLineObject) P1).getP1().getY3D(); double c1=((TwoPointLineObject) P1).getP1().getZ3D(); double a2=((TwoPointLineObject) P1).getP2().getX3D(); double b2=((TwoPointLineObject) P1).getP2().getY3D(); double c2=((TwoPointLineObject) P1).getP2().getZ3D(); double a3=((TwoPointLineObject) P2).getP1().getX3D(); double b3=((TwoPointLineObject) P2).getP1().getY3D(); double c3=((TwoPointLineObject) P2).getP1().getZ3D(); double a4=((TwoPointLineObject) P2).getP2().getX3D(); double b4=((TwoPointLineObject) P2).getP2().getY3D(); double c4=((TwoPointLineObject) P2).getP2().getZ3D(); double det =(a2-a1)*(b3-b4)+(b2-b1)*(a4-a3); double dets=(b3-b1)*(a4-a3)-(a3-a1)*(b4-b3); double dett=(a2-a1)*(b3-b1)-(b2-b1)*(a3-a1); int choice = 1; if(Math.abs(det)<1e-12) { det =(b2-b1)*(c3-c4)+(c2-c1)*(b4-b3); dets=(c3-c1)*(b4-b3)-(b3-b1)*(c4-c3); dett=(b2-b1)*(c3-c1)-(c2-c1)*(b3-b1); choice = 2; } if(Math.abs(det)<1e-12) { det =(a2-a1)*(c3-c4)+(c2-c1)*(a4-a3); dets=(a3-a1)*(c3-c4)+(c3-c1)*(a4-a3); dett=(a2-a1)*(c3-c1)-(c2-c1)*(a3-a1); choice = 3; } double s, t; s=dets/det; t=dett/det; if ( (choice==1 && Math.abs((c2-c1)*s-(c4-c3)*t-c3+c1)<1e-12) || (choice==2 && Math.abs((b2-b1)*s-(b4-b3)*t-b3+b1)<1e-12) || (choice==3 && Math.abs((a2-a1)*s-(a4-a3)*t-a3+a1)<1e-12)) { setX3D(a1+s*(a2-a1)); setY3D(b1+s*(b2-b1)); setZ3D(c1+s*(c2-c1)); setIs3D(true); setSuperHidden(false); } else { setSuperHidden(true); } } catch (final Exception ex) { //System.err.println("Error : "+ex); } } */ } }