mirror of
https://github.com/Irev-Dev/Round-Anything.git
synced 2025-01-17 02:58:14 +01:00
Merge pull request #17 from Irev-Dev/issue16-fix-90deg-bug-in-findPoint
Fix 90 degree bug in findPoint
This commit is contained in:
commit
297a7ce5dc
@ -336,15 +336,22 @@ function parallelFollow(rp,thick=4,minR=1,mode=1)=
|
|||||||
)
|
)
|
||||||
concat(cen,outR);
|
concat(cen,outR);
|
||||||
|
|
||||||
|
function is90or270(ang)=ang==90?1:ang==270?1:0;
|
||||||
|
|
||||||
function findPoint(ang1,refpoint1,ang2,refpoint2,r=0)=
|
function findPoint(ang1,refpoint1,ang2,refpoint2,r=0)=
|
||||||
// finds the intersection of two lines given two angles and points on those lines
|
// finds the intersection of two lines given two angles and points on those lines
|
||||||
let(
|
let(
|
||||||
|
overrideX=is90or270(ang1)?
|
||||||
|
refpoint1.x:
|
||||||
|
is90or270(ang2)?
|
||||||
|
refpoint2.x:
|
||||||
|
0,
|
||||||
m1=tan(ang1),
|
m1=tan(ang1),
|
||||||
c1=refpoint1.y-m1*refpoint1.x,
|
c1=refpoint1.y-m1*refpoint1.x,
|
||||||
m2=tan(ang2),
|
m2=tan(ang2),
|
||||||
c2=refpoint2.y-m2*refpoint2.x,
|
c2=refpoint2.y-m2*refpoint2.x,
|
||||||
outputX=ang1==90?refpoint1.x:ang2==90?refpoint2.x:(c2-c1)/(m1-m2),
|
outputX=overrideX?overrideX:(c2-c1)/(m1-m2),
|
||||||
outputY=ang1==90?m2*outputX+c2:m1*outputX+c1
|
outputY=is90or270(ang1)?m2*outputX+c2:m1*outputX+c1
|
||||||
)
|
)
|
||||||
[outputX,outputY,r];
|
[outputX,outputY,r];
|
||||||
|
|
||||||
@ -384,13 +391,23 @@ function beamChain(radiiPoints,offset1=0,offset2,mode=0,minR=0,startAngle,endAng
|
|||||||
getAngle(radiiPoints[Lrp-1],radiiPoints[Lrp-2])+endAngle:
|
getAngle(radiiPoints[Lrp-1],radiiPoints[Lrp-2])+endAngle:
|
||||||
endAngle,
|
endAngle,
|
||||||
OffLn1=[for(i=[0:Lrp3]) offset1==0?radiiPoints[i+1]:parallelFollow([radiiPoints[i],radiiPoints[i+1],radiiPoints[i+2]],offset1,minR,mode=CWorCCW1)],
|
OffLn1=[for(i=[0:Lrp3]) offset1==0?radiiPoints[i+1]:parallelFollow([radiiPoints[i],radiiPoints[i+1],radiiPoints[i+2]],offset1,minR,mode=CWorCCW1)],
|
||||||
OffLn2=[for(i=[0:Lrp3]) offset2==0?radiiPoints[i+1]:parallelFollow([radiiPoints[i],radiiPoints[i+1],radiiPoints[i+2]],offset2b,minR,mode=CWorCCW2)],
|
OffLn2=[for(i=[0:Lrp3]) offset2==0?radiiPoints[i+1]:parallelFollow([radiiPoints[i],radiiPoints[i+1],radiiPoints[i+2]],offset2b,minR,mode=CWorCCW2)],
|
||||||
|
|
||||||
Rp1=abs(radiiPoints[0].z),
|
Rp1=abs(radiiPoints[0].z),
|
||||||
Rp2=abs(radiiPoints[Lrp-1].z),
|
Rp2=abs(radiiPoints[Lrp-1].z),
|
||||||
endP1a=findPoint(getAngle(radiiPoints[0],radiiPoints[1]), OffLn1[0], startAngle,radiiPoints[0], Rp1),
|
|
||||||
endP1b=findPoint(getAngle(radiiPoints[Lrp-1],radiiPoints[Lrp-2]), OffLn1[len(OffLn1)-1], endAngle,radiiPoints[Lrp-1], Rp2),
|
endP1aAngle = getAngle(radiiPoints[0],radiiPoints[1]),
|
||||||
endP2a=findPoint(getAngle(radiiPoints[0],radiiPoints[1]), OffLn2[0], startAngle,radiiPoints[0], Rp1),
|
endP1a=findPoint(endP1aAngle, OffLn1[0], startAngle,radiiPoints[0], Rp1),
|
||||||
endP2b=findPoint(getAngle(radiiPoints[Lrp-1],radiiPoints[Lrp-2]), OffLn2[len(OffLn1)-1], endAngle,radiiPoints[Lrp-1], Rp2),
|
|
||||||
|
endP1bAngle = getAngle(radiiPoints[Lrp-1],radiiPoints[Lrp-2]),
|
||||||
|
endP1b=findPoint(endP1bAngle, OffLn1[len(OffLn1)-1], endAngle,radiiPoints[Lrp-1], Rp2),
|
||||||
|
|
||||||
|
endP2aAngle = getAngle(radiiPoints[0],radiiPoints[1]),
|
||||||
|
endP2a=findPoint(endP2aAngle, OffLn2[0], startAngle,radiiPoints[0], Rp1),
|
||||||
|
|
||||||
|
endP2bAngle = getAngle(radiiPoints[Lrp-1],radiiPoints[Lrp-2]),
|
||||||
|
endP2b=findPoint(endP2bAngle, OffLn2[len(OffLn1)-1], endAngle,radiiPoints[Lrp-1], Rp2),
|
||||||
|
|
||||||
absEnda=getAngle(endP1a,endP2a),
|
absEnda=getAngle(endP1a,endP2a),
|
||||||
absEndb=getAngle(endP1b,endP2b),
|
absEndb=getAngle(endP1b,endP2b),
|
||||||
negRP1a=[cos(absEnda)*radiiPoints[0].z*10+endP1a.x, sin(absEnda)*radiiPoints[0].z*10+endP1a.y, 0.0],
|
negRP1a=[cos(absEnda)*radiiPoints[0].z*10+endP1a.x, sin(absEnda)*radiiPoints[0].z*10+endP1a.y, 0.0],
|
||||||
|
@ -232,7 +232,7 @@ module gridpattern(memberW = 4, sqW = 12, iter = 5, r = 3){
|
|||||||
|
|
||||||
|
|
||||||
module testGeometries() {
|
module testGeometries() {
|
||||||
// Check these shapen preview (plus "thrown together") and render correctly with each PR
|
// Check these shapes preview (plus "thrown together") and render correctly with each PR
|
||||||
points = [
|
points = [
|
||||||
[0, 10, 5],
|
[0, 10, 5],
|
||||||
[10, 0, 5],
|
[10, 0, 5],
|
||||||
@ -248,6 +248,15 @@ module testGeometries() {
|
|||||||
polyRoundExtrudeTestShape(points);
|
polyRoundExtrudeTestShape(points);
|
||||||
translate([0,20,0])polyRoundExtrudeTestShape(reversedPoints);
|
translate([0,20,0])polyRoundExtrudeTestShape(reversedPoints);
|
||||||
|
|
||||||
|
// Bug report submitted by @lopisan in issue #16, similar to #11, geometry breaks with 90 degree angles
|
||||||
|
didBreakWhen0=0;
|
||||||
|
issue16pointsa=[[0, 0, 0], [0+didBreakWhen0, 10, 0], [10, 10+didBreakWhen0, 0]];
|
||||||
|
translate([20,0,0])linear_extrude(1)polygon(polyRound( beamChain(issue16pointsa, offset1=1, offset2=-1), 30));
|
||||||
|
|
||||||
|
didBreakWhen0b=1e-6;
|
||||||
|
issue16pointsb=[[0, 0, 0], [0+didBreakWhen0b, 10, 0], [10, 10+didBreakWhen0b, 0]];
|
||||||
|
translate([20,15,0])linear_extrude(1)polygon(polyRound( beamChain(issue16pointsb, offset1=1, offset2=-1), 30));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
module polyRoundExtrudeTestShape(points) {
|
module polyRoundExtrudeTestShape(points) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user