Liste der Anhänge anzeigen (Anzahl: 1)
Distanz Punkt Polygon
Hey allerseits,
ich suche nach einer Herangehensweise einen Punkt-Polygon-Abstand zu berechnen.
Ich stell die Frage gleich mal hier rein, weil ich mich schon ewig tüfteln sehe um eine wackelige Lösung zu finden. Habe im SDK auf jeden noch nix gefunden oder es schlichtweg überlesen :/
In meiner Vorstellung sollten die selektierten Punkte dem größeren Polygon des anderen Objektes zugeordnet werden und die anderen dem anderen des anderen.
[Only registered and activated users can see links. Click Here To Register...]
Grüße und Danke schonmal :)
rownn
Liste der Anhänge anzeigen (Anzahl: 2)
So, habe ein bisschen Zeit gefunden da mal zu tüfteln. Is irgendwie ein arrg langer Code geworden ... ni so geil, aber ich denke dass es erstmal funktioniert. Theoretisch sollte jetzt immer der kürzeste Abstand vom Punkt zum Objekt plus Polygonindex berechnet werden.
Worauf ich hinaus will soll zwar kein LiveUpdateZeusch sein, aber ich bange um die Performance ... mal schauen.
[Only registered and activated users can see links. Click Here To Register...]
Code:
PointPolygonobjectDistance(point, polygonobject)
Parameters
point = globaler Vektor
polygonobject = das Polygonobject
return: list
distance = kürzeste Distanz zw. Punkt und Objekt
vector = globaler Vektor auf Objekt
polyID = Index des Polygons
Code:
import c4d
import math
#Welcome to the world of Python
def IsInTriXY(tp0, tp1, tp2, p):
dvs = [(tp^c4d.Vector(1,1,0))-(p^c4d.Vector(1,1,0)) for tp in [tp0, tp1, tp2]]
return int(sum([c4d.utils.GetAngle(dvs[i], dvs[(i+1)%3]) for i in xrange(3)])*1000) == int(math.pi*2*1000)
def DistanceVectorTriXY(tp0, tp1, tp2, p):
return min([c4d.utils.PointLineSegmentDistance2D(tp0, tp1, p), c4d.utils.PointLineSegmentDistance2D(tp1, tp2, p), c4d.utils.PointLineSegmentDistance2D(tp2, tp0, p)], key=lambda t: t[0])
def GetTriMatrix(p0, p1, p2):
off = (p0+p1+p2)/3
aim = ((p1+p2)/2-p0).GetNormalized()
third = aim.Cross(p1-p2).GetNormalized()
up = aim.Cross(third).GetNormalized()
return c4d.Matrix(off, aim, up, -third)
def PointPolygonobjectDistance(point, polygonobject):
mg = polygonobject.GetMg()
pnts = [p*mg for p in polygonobject.GetAllPoints()]
plys = polygonobject.GetAllPolygons()
distance = 100000000.0
vector = c4d.Vector()
polyID = -1
for index, ply in enumerate(plys):
if ply.IsTriangle(): tris = ([pnts[ply.a],pnts[ply.b],pnts[ply.c]],)
else: tris = ([pnts[ply.a],pnts[ply.b],pnts[ply.c]], [pnts[ply.a],pnts[ply.c],pnts[ply.d]])
for tri in tris:
triMg = GetTriMatrix(tri[0], tri[1], tri[2])
triPoints = [p*~triMg for p in tri]
pointInM = point*~triMg
if IsInTriXY(triPoints[0], triPoints[1], triPoints[2], pointInM):
if int(distance*10000) > int(abs(pointInM.z)*10000):
distance = abs(pointInM.z)
vector = (pointInM^c4d.Vector(1,1,0))*triMg
polyID = index
else:
tup = DistanceVectorTriXY(triPoints[0], triPoints[1], triPoints[2], pointInM)
d = math.sqrt(tup[0]**2+pointInM.z**2)
if int(distance*10000) > int(d*10000):
distance = d
vector = tup[1]*triMg
polyID = index
return distance, vector, polyID
def main():
obj = op.GetObject()
A = doc.SearchObject("A")
dist, vec, index = PointPolygonobjectDistance(A.GetRelPos(), obj)
Grüße
rownn
PS: @pyrael, besten Dank für die Zeilen. :)