Skip to content

Commit a6999a7

Browse files
author
Kurt Hutten
committed
Issue-16 Fix 90 degree bug in find findPoint
Actually very similar to issue-11, but I just didn't solve it 100%
1 parent a85e6ff commit a6999a7

File tree

2 files changed

+34
-8
lines changed

2 files changed

+34
-8
lines changed

polyround.scad

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -336,15 +336,22 @@ function parallelFollow(rp,thick=4,minR=1,mode=1)=
336336
)
337337
concat(cen,outR);
338338

339+
function is90or270(ang)=ang==90?1:ang==270?1:0;
340+
339341
function findPoint(ang1,refpoint1,ang2,refpoint2,r=0)=
340342
// finds the intersection of two lines given two angles and points on those lines
341343
let(
344+
overrideX=is90or270(ang1)?
345+
refpoint1.x:
346+
is90or270(ang2)?
347+
refpoint2.x:
348+
0,
342349
m1=tan(ang1),
343350
c1=refpoint1.y-m1*refpoint1.x,
344351
m2=tan(ang2),
345352
c2=refpoint2.y-m2*refpoint2.x,
346-
outputX=ang1==90?refpoint1.x:ang2==90?refpoint2.x:(c2-c1)/(m1-m2),
347-
outputY=ang1==90?m2*outputX+c2:m1*outputX+c1
353+
outputX=overrideX?overrideX:(c2-c1)/(m1-m2),
354+
outputY=is90or270(ang1)?m2*outputX+c2:m1*outputX+c1
348355
)
349356
[outputX,outputY,r];
350357

@@ -384,13 +391,23 @@ function beamChain(radiiPoints,offset1=0,offset2,mode=0,minR=0,startAngle,endAng
384391
getAngle(radiiPoints[Lrp-1],radiiPoints[Lrp-2])+endAngle:
385392
endAngle,
386393
OffLn1=[for(i=[0:Lrp3]) offset1==0?radiiPoints[i+1]:parallelFollow([radiiPoints[i],radiiPoints[i+1],radiiPoints[i+2]],offset1,minR,mode=CWorCCW1)],
387-
OffLn2=[for(i=[0:Lrp3]) offset2==0?radiiPoints[i+1]:parallelFollow([radiiPoints[i],radiiPoints[i+1],radiiPoints[i+2]],offset2b,minR,mode=CWorCCW2)],
394+
OffLn2=[for(i=[0:Lrp3]) offset2==0?radiiPoints[i+1]:parallelFollow([radiiPoints[i],radiiPoints[i+1],radiiPoints[i+2]],offset2b,minR,mode=CWorCCW2)],
395+
388396
Rp1=abs(radiiPoints[0].z),
389397
Rp2=abs(radiiPoints[Lrp-1].z),
390-
endP1a=findPoint(getAngle(radiiPoints[0],radiiPoints[1]), OffLn1[0], startAngle,radiiPoints[0], Rp1),
391-
endP1b=findPoint(getAngle(radiiPoints[Lrp-1],radiiPoints[Lrp-2]), OffLn1[len(OffLn1)-1], endAngle,radiiPoints[Lrp-1], Rp2),
392-
endP2a=findPoint(getAngle(radiiPoints[0],radiiPoints[1]), OffLn2[0], startAngle,radiiPoints[0], Rp1),
393-
endP2b=findPoint(getAngle(radiiPoints[Lrp-1],radiiPoints[Lrp-2]), OffLn2[len(OffLn1)-1], endAngle,radiiPoints[Lrp-1], Rp2),
398+
399+
endP1aAngle = getAngle(radiiPoints[0],radiiPoints[1]),
400+
endP1a=findPoint(endP1aAngle, OffLn1[0], startAngle,radiiPoints[0], Rp1),
401+
402+
endP1bAngle = getAngle(radiiPoints[Lrp-1],radiiPoints[Lrp-2]),
403+
endP1b=findPoint(endP1bAngle, OffLn1[len(OffLn1)-1], endAngle,radiiPoints[Lrp-1], Rp2),
404+
405+
endP2aAngle = getAngle(radiiPoints[0],radiiPoints[1]),
406+
endP2a=findPoint(endP2aAngle, OffLn2[0], startAngle,radiiPoints[0], Rp1),
407+
408+
endP2bAngle = getAngle(radiiPoints[Lrp-1],radiiPoints[Lrp-2]),
409+
endP2b=findPoint(endP2bAngle, OffLn2[len(OffLn1)-1], endAngle,radiiPoints[Lrp-1], Rp2),
410+
394411
absEnda=getAngle(endP1a,endP2a),
395412
absEndb=getAngle(endP1b,endP2b),
396413
negRP1a=[cos(absEnda)*radiiPoints[0].z*10+endP1a.x, sin(absEnda)*radiiPoints[0].z*10+endP1a.y, 0.0],

roundAnythingExamples.scad

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ module gridpattern(memberW = 4, sqW = 12, iter = 5, r = 3){
232232

233233

234234
module testGeometries() {
235-
// Check these shapen preview (plus "thrown together") and render correctly with each PR
235+
// Check these shapes preview (plus "thrown together") and render correctly with each PR
236236
points = [
237237
[0, 10, 5],
238238
[10, 0, 5],
@@ -248,6 +248,15 @@ module testGeometries() {
248248
polyRoundExtrudeTestShape(points);
249249
translate([0,20,0])polyRoundExtrudeTestShape(reversedPoints);
250250

251+
// Bug report submitted by @lopisan in issue #16, similar to #11, geometry breaks with 90 degree angles
252+
didBreakWhen0=0;
253+
issue16pointsa=[[0, 0, 0], [0+didBreakWhen0, 10, 0], [10, 10+didBreakWhen0, 0]];
254+
translate([20,0,0])linear_extrude(1)polygon(polyRound( beamChain(issue16pointsa, offset1=1, offset2=-1), 30));
255+
256+
didBreakWhen0b=1e-6;
257+
issue16pointsb=[[0, 0, 0], [0+didBreakWhen0b, 10, 0], [10, 10+didBreakWhen0b, 0]];
258+
translate([20,15,0])linear_extrude(1)polygon(polyRound( beamChain(issue16pointsb, offset1=1, offset2=-1), 30));
259+
251260
}
252261

253262
module polyRoundExtrudeTestShape(points) {

0 commit comments

Comments
 (0)