2016-04-03 6 views
1

ich eine Funktion in Python zu finden, wenn ein Punkt in einem 2d-Dreieck ist, das wie folgt aussieht:Schleife für Punkte in 2D Dreiecken

def isInsideTriangle(P,p1,p2,p3): #is P inside triangle made by p1,p2,p3? 
    x,x1,x2,x3 = P[0],p1[0],p2[0],p3[0] 
    y,y1,y2,y3 = P[1],p1[1],p2[1],p3[1] 
    full = abs (x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2)) 
    first = abs (x1 * (y2 - y) + x2 * (y - y1) + x * (y1 - y2)) 
    second = abs (x1 * (y - y3) + x * (y3 - y1) + x3 * (y1 - y)) 
    third = abs (x * (y2 - y3) + x2 * (y3 - y) + x3 * (y - y2)) 
    return abs(first + second + third - full) < .0000000001 

Mein ‚P‘ ist ein Bündel von (etwa 15) Punkte, das von diesem (Stück) Datei kommen:

PointXY 
[387.9385, 200.0] 
PointXY 
[200.0, 387.9385] 
PointXY 
[200.0, 387.9385] 
PointXY 
[200.0, 353.2089] 
PointXY 

My p1, p2 und p3 ist die Ecke in der Dreiecke Koordinaten. Sie kommen aus diesem (Stück) Datei:

TriangleXY 
[193.0371, 0.1218346] 
[193.0244, 0.1218346] 
[186.0572, 0.4871899] 
TriangleXY 
[206.9799, 0.1218346] 
[206.9756, 0.1218346] 
[213.9428, 0.4871899] 
TriangleXY 
[193.0244, 0.1218346] 
[193.0371, 0.1218346] 
[200.0, 0.0] 
TriangleXY 
[206.9756, 0.1218346] 

Was ich mein Skript tun wollen, ist IF jeder Punkt (e) ist in (oder auf der Seite) jedem Dreieck (n), kehren Sie mir die (3) spezifische Koordinaten aus diesem Dreieck p1, p2 und p3 und dem spezifischen Punkt P, der darin enthalten ist. Es funktioniert jetzt nur für ein einzelnes P und eine einzelne Menge von p1, p2 und p3, und ich möchte, dass es für alle Punkte P und alle dreieckigen Ecken p1, p2 und p3 funktioniert. Hat jemand eine Idee wie man das in meinem Skript entsprechend anpasst? Mein P und P1, P2 und P3 werden durch diese Skripte genannt:

# triangle coordinates p1 p2 p3 
g = open("spheretop1.stl", "r") 
m = open("TriangleXYcoordinates.gcode", "w") 
searchlines = g.readlines() 
file = "" 

for i, line in enumerate(searchlines): 
    if "outer loop" in line: 
     p1 = map(float, searchlines[i+1].split()[1:3]) 
     p2 = map(float, searchlines[i+2].split()[1:3]) 
     p3 = map(float, searchlines[i+3].split()[1:3]) 
     m.write("TriangleXY" + "\n" + str(p1) + "\n" + str(p2) + "\n" + str(p3) + "\n") 

# Point coordinates P 
import json 
h = open("PointXYcoordinates.gcode", "r") 
searchlines = h.readlines() 
file = "" 

for i, line in enumerate(searchlines): 
    if "PointXY" in line: 
     P = json.loads(searchlines[i+1].strip()) 
+0

@ idjaw ist die Information in dieser Frage klar genug? – Henry

Antwort

1

Vielleicht haben Sie so etwas wie dies wollen:

def pointsInsideTriangles(points,triangles): 
    for (P in points): 
     for (t in triangles): 
      if isInsideTriangle(P,t[0],t[1],t[2]): 
       print("Point " + str(P) + " is inside traingle " + str(t)) 

Insgesamt Sie so etwas wie haben würde:

def isInsideTriangle(P,p1,p2,p3): #is P inside triangle made by p1,p2,p3? 
    x,x1,x2,x3 = P[0],p1[0],p2[0],p3[0] 
    y,y1,y2,y3 = P[1],p1[1],p2[1],p3[1] 
    full = abs (x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2)) 
    first = abs (x1 * (y2 - y) + x2 * (y - y1) + x * (y1 - y2)) 
    second = abs (x1 * (y - y3) + x * (y3 - y1) + x3 * (y1 - y)) 
    third = abs (x * (y2 - y3) + x2 * (y3 - y) + x3 * (y - y2)) 
    return abs(first + second + third - full) < .0000000001 

def pointsInsideTriangles(points,triangles): 
    for (P in points): 
     for (t in triangles): 
      if isInsideTriangle(P,t[0],t[1],t[2]): 
       print("Point " + str(P) + " is inside triangle " + str(t)) 


# triangle coordinates p1 p2 p3 
points = []; 
triangles = []; 
g = open("spheretop1.stl", "r") 
m = open("TriangleXYcoordinates.gcode", "w") 
searchlines = g.readlines() 
file = "" 

for i, line in enumerate(searchlines): 
    if "outer loop" in line: 
     p1 = map(float, searchlines[i+1].split()[1:3]) 
     p2 = map(float, searchlines[i+2].split()[1:3]) 
     p3 = map(float, searchlines[i+3].split()[1:3]) 
     m.write("TriangleXY" + "\n" + str(p1) + "\n" + str(p2) + "\n" + str(p3) + "\n") 
     triangles.append([p1,p2,p3]) 


# Point coordinates P 
import json 
h = open("PointXYcoordinates.gcode", "r") 
searchlines = h.readlines() 
file = "" 

for i, line in enumerate(searchlines): 
    if "PointXY" in line: 
     P = json.loads(searchlines[i+1].strip()) 
     points.append(P) 

pointsInsideTriangles(points,triangles) 
+0

Ich erhalte einen Fehler, wenn ich versuche, den Code auszuführen, "für (P in Punkten)": ungültige Syntax. (nach def PunktenInsideTriangles (Punkte, Dreiecke)).] – Henry

+0

Verwenden Sie die gleiche Großschreibung für die 'points' Variable. Ändere die Zeile zu 'for (P in points):' – Pedro

+0

Danke, eine Sache übrig, weißt du, wie man alle Duplikate entfernt, die meine Funktion zeigtInsideTriangles (Punkte, Dreiecke) gibt mir? Grundsätzlich gibt der Druck am Ende mir eine ganze Liste von Werten, aber einige sind Duplikate .. – Henry