public static Punct3D XSint4P(Punct3D A1, Punct3D A2, Punct3D B1, Punct3D B2) { try { //Calculul parametrilor segmentului A1A2 double aA = (A2.Z - A1.Z) / (A2.Offset - A1.Offset); double bA = A1.Offset * (A2.Z - A1.Z) / (A1.Offset - A2.Offset) - A1.Z; //Calculul parametrilor segmentului B1B2 double aB = (B2.Z - B1.Z) / (B2.Offset - B1.Offset); double bB = B1.Offset * (B2.Z - A1.Z) / (B1.Offset - B2.Offset) - A1.Z; //Calculul punctului de intersectie double offInt = (bB - bA) / (aA - aB); double zInt = A1.Z + (offInt - A1.Offset) * aA; Punct3D punct = new Punct3D(); punct.KM = A1.KM; punct.Offset = offInt; punct.Z = zInt; return(punct); } catch { return(null); } }
public static String3D XSintersect(String3D S1, String3D S2) { String3D S = new String3D(); for (int i = 0; i <= S1.Count - 2; i++) { for (int j = 0; j <= S2.Count - 2; j++) { Punct3D punct = XSint4P(S1[i], S1[i + 1], S2[j], S2[j + 1]); if (punct.Offset >= S1[i].Offset && punct.Offset <= S1[i + 1].Offset) { S.Add(punct); } } } if (S.Count > 0) { return(S); } else { return(null); } }
//Functie statica ce returneaza un Punct3D cu valori citite dintr-un segment text public static Punct3D StringToPoint(string text, Format tip, DelimitedBy separator) { try { Punct3D punct = new Punct3D(); punct.ValuesFromString(text, tip, separator); return(punct); } catch { return(null); } }
public static String3D XStrimextend(String3D XS, String3D XSTinta) { String3D XSrezultat = new String3D(); if (XS.Count < 2 || XSTinta.Count < 2) { return(XS); } for (int i = 0; i < XS.Count; i++) { if (i == 0) { for (int j = 0; j < XSTinta.Count - 1; j++) { Punct3D P = (Punct3D)XSint4P(XS[0], XS[1], XSTinta[j], XSTinta[j + 1]); if (P.Offset <= XS[1].Offset && P.Offset >= XSTinta[j].Offset && P.Offset <= XSTinta[j + 1].Offset) { XSrezultat.Add(P); } } if (XSrezultat.Count == 0) { XSrezultat.Add(XS[0]); } } else if (i == XS.Count - 1) { for (int j = 0; j < XSTinta.Count - 1; j++) { Punct3D P = (Punct3D)XSint4P(XS[XS.Count - 2], XS[XS.Count - 1], XSTinta[j], XSTinta[j + 1]); if (P.Offset >= XS[XS.Count - 2].Offset && P.Offset >= XSTinta[j].Offset && P.Offset <= XSTinta[j + 1].Offset) { XSrezultat.Add(P); } } if (XSrezultat.Count < XS.Count) { XSrezultat.Add(XS[XS.Count - 1]); } } else { XSrezultat.Add(XS[i]); } } return(XSrezultat); }