2016-04-03 39 views
1

bir nokta gibi görünecek biçimde, bir 2d üçgeninde ise bulmak için Python bir işlevi var triangles Bu (parça) gelen noktalar, dosya:Döngü

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

Benim p1, p2 ve p3 köşe üçgenleri koordinatları vardır. Bana dönün herhangi bir nokta (lar) herhangi bir üçgen (ler) (veya yan tarafında) bulunan IF

benim komut dosyası yapmak istiyorum ne
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] 

şöyledir: Onlar dosya bu (parça) gelen (3) p1, p2 ve p3 üçgeninden gelen özel koordinatlar ve içinde bulunan P noktası. Artık sadece tek bir P ve tek bir p1, p2 ve p3 seti için çalışıyor ve P ve tüm üçgen köşeleri p1, p2 ve p3 için çalışmasını istiyorum. Bunu benim senaryoda buna göre nasıl ayarlayacağımı bilen var mı? Benim P ve p1, p2 ve p3 bu komut dosyaları tarafından verilir:

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)) 

Toplamda gibi bir şey olurdu:

# 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 bu sorudaki bilgi yeterince açık mı? – Henry

cevap

1

Belki böyle bir şey istiyorum

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

Kodu çalıştırmayı denediğimde bir hata alıyorum "için (P in Points)": geçersiz sözdizimi. (pointInsideTriangles (puanlar, üçgenler) öğesinden sonra.] – Henry

+0

, "points" değişkeni için aynı büyük/küçük harfleri kullanır. Satırı değiştirmek için '(P in noktaları): ' – Pedro

+0

Teşekkürler, bir şey kaldı, fonksiyonumun işaret ettiği tüm yinelemelerin nasıl kaldırılacağını biliyor musunuz? Temelde baskı sonunda bana bir bütün değerler listesi verir, ancak bazıları çoğaltılır .. – Henry