Home › Forums › Problems and solutions in GDL › GDL add-ons › Polygon Operations Extension › Reply To: Polygon Operations Extension
I opend the “Sill”-macro and tried to reverse-engeneer it but – real – “i am lost” with this.
It was much easier for me to write my own code for it to calculate the intersectionpoints:
“Innenversatz der Kontur”:
breite = -UEBERDAEMMUNGSBREITE
for k = 1 to points
!! Zuweisungen zu Segment
if k = 1 then !! 1. Segment – ergibt auch letzten Punkt
Winkelzuvor = alpha2D[points]
Winkeljetzt = alpha2D[k]
Winkeldanach = alpha2D[k+1]
x1=x[points-1] !!!Koordinaten im Segment rauspicken
x2=x[k]
y1=y[points-1]
y2=y[k]
x11=x[k] !!!Koordinaten im Segment rauspicken
x21=x[k+1]
y11=y[k]
y21=y[k+1]
gosub “Parallele1”
gosub “Parallele2”
gosub “Schnittpunkte1”
gosub “Schnittpunkt zweier Linien – 2D”
! addx xp[k]
! addy yp[k]
! circle 0.01
! del 2
endif
if k # points and k#1 then !! zwischen- Segmente
Winkelzuvor = alpha2D[k-1]
Winkeljetzt = alpha2D[k]
Winkeldanach = alpha2D[1]
x1=x[k-1] !!!Koordinaten im Segment rauspicken
x2=x[k]
y1=y[k-1]
y2=y[k]
x11=x[k] !!!Koordinaten im Segment rauspicken
x21=x[k+1]
y11=y[k]
y21=y[k+1]
gosub “Parallele1”
gosub “Parallele2”
gosub “Schnittpunkte1”
gosub “Schnittpunkt zweier Linien – 2D”
! addx xp[k]
! addy yp[k]
! circle 0.01
! del 2
endif
!! Ende zu Segment
next k
!
!for k= 1 to points-1
!
! put xp[k]
! put yp[k]
!
!next k
!
!
!
!PRISM nsp/2, 0.01, !! Dummy-Prism für den späteren Wallniche-Befehl
!get(nsp)
!
return !!! Ende “Innenversatz der Kontur”
“Parallele1”:
dx = x2 – x1 !!!x+y Distanz der Punkte des Segmentes
dy = y2 – y1
if dx < 0 then dx = -dx
if abs(dx) < eps then dx=eps
if dx < eps and dx < -eps then
Winkelsegment = 90
else
WinkelSegment = atn(dy/dx)
endif
RewinSeg = WinkelSegment – 90
Diagonale1 = sqr (dx^2+dy^2) !!!!Distanz der Punkte des Segmentes
P1x1 = -breite * cos(RewinSeg)+x1
P1y1 = -breite * sin(RewinSeg)+y1
p1x2 = -breite * cos(RewinSeg)+x2
p1y2 = -breite * sin(RewinSeg)+y2
if x2 < x1 then
P1y1 = breite * sin(RewinSeg)+y1
p1y2 = breite * sin(RewinSeg)+y2
else
endif
return
“Parallele2”:
dx1 = x21 – x11 !!!x+y Distanz der Punkte des Segmentes
dy1 = y21 – y11
if dx1 < 0 then dx1 = -dx1
if abs(dx1) < eps then dx1 = eps
if dx1 < eps and dx1 < -eps then
Winkelsegment1 = 90
else
WinkelSegment1 = atn(dy1/dx1)
endif
RewinSeg1 = WinkelSegment1 – 90
Diagonale2 = sqr (dx1^2+dy1^2) !!!!Distanz der Punkte des Segmentes
P2x1 = -breite * cos(RewinSeg1)+x11
P2y1 = -breite * sin(RewinSeg1)+y11
p2x2 = -breite * cos(RewinSeg1)+x21
p2y2 = -breite * sin(RewinSeg1)+y21
if x21 < x11 then
P2y1 = breite * sin(RewinSeg1)+y11
p2y2 = breite * sin(RewinSeg1)+y21
else
endif
return
“Schnittpunkte1”: !!!!Nicht von mir erfunden!
getValues = 1
put p1x1, p1y1, p1x2, p1y2, p2x1, p2y1, p2x2, p2y2
gosub “Schnittpunkt zweier Linien – 2D”
if not(parallelLines~5) then
spx = x~5
spy = y~5
xp[k] = spx
yp[k] = spy
else
endif
return
“Schnittpunkt zweier Linien – 2D”: !!!!Nicht von mir erfunden!
if getValues then
x11~5 = get(1): y11~5 = get(1)
x12~5 = get(1): y12~5 = get(1)
x21~5 = get(1): y21~5 = get(1)
x22~5 = get(1): y22~5 = get(1)
getValues = 0
endif
u1x~5 = x12~5 – x11~5
u1y~5 = y12~5 – y11~5
u2x~5 = x22~5 – x21~5
u2y~5 = y22~5 – y21~5
!Prüfung ob parallel und Punkt finden
D~5 = u2x~5*u1y~5 – u1x~5*u2y~5
if abs(D~5) < eps then
parallelLines~5 = 1
else
parallelLines~5 = 0
endif
!Schnittpunkt von nicht parallelen Linien:
if not(parallelLines~5) then
t~5 = (u1x~5*(y21~5 – y11~5) – u1y~5*(x21~5 – x11~5))/D~5
x~5 = x21~5 + t~5*u2x~5
y~5 = y21~5 + t~5*u2y~5
else
xp[k] = P2x1!p1x2 !!!!!!!!!!!!nur die halbe Wahrheit – nur für genau waagrechte und senkrechte Polygone möglich!!!
yp[k] = P2y1!p2y2 !!! falls parallele waagrechte, dann nimm die Y und Y der vorigen Punkte
!!!!!! für iregndwelchen anders geneigten Parallelen muß es noch gerechnet werden!!
endif
return
If someone needs it - feel free to use it. The central part is not from me - ist an internet-advice from a friend i dont know where he got it: So i cant tell about licence of this Code..
“Schnittpunkt zweier Linien – 2D”: !!!!Nicht von mir erfunden!
if getValues then
x11~5 = get(1): y11~5 = get(1)
x12~5 = get(1): y12~5 = get(1)
x21~5 = get(1): y21~5 = get(1)
x22~5 = get(1): y22~5 = get(1)
getValues = 0
endif
u1x~5 = x12~5 – x11~5
u1y~5 = y12~5 – y11~5
u2x~5 = x22~5 – x21~5
u2y~5 = y22~5 – y21~5
!Prüfung ob parallel und Punkt finden
D~5 = u2x~5*u1y~5 – u1x~5*u2y~5
if abs(D~5) < eps then
parallelLines~5 = 1
else
parallelLines~5 = 0
endif
!Schnittpunkt von nicht parallelen Linien:
if not(parallelLines~5) then
t~5 = (u1x~5*(y21~5 – y11~5) – u1y~5*(x21~5 – x11~5))/D~5
x~5 = x21~5 + t~5*u2x~5
y~5 = y21~5 + t~5*u2y~5
else
xp[k] = P2x1!p1x2 !!!!!!!!!!!!nur die halbe Wahrheit – nur für genau waagrechte und senkrechte Polygone möglich!!!
yp[k] = P2y1!p2y2 !!! falls parallele waagrechte, dann nimm die Y und Y der vorigen Punkte
!!!!!! für iregndwelchen anders geneigten Parallelen muß es noch gerechnet werden!!
endif
`
Teacher in HTL-Salzburg
AC5-19, Win and Mac
GDL hobby developer