# Span an area between 3 points

17 messages
Open this post in threaded view
|

## Span an area between 3 points

 I have reduced my problem (see Trouble-with-rotating-Text-to-correct-orientation ) to one rotating angel, I cannot find the correct calculation. The task is to span an area between two points P1 and P2 in a direction given by a direction vector D (which is identical to the problem in the subject). The image illustrates it: If you load the attached script ( span-area.scad  ) into OpenSCAD and open the Customizer, you can move P1 and P2 anywhere and the grey fill area is placed perfect. You can also change d.z from the direction vector d. But if you change d.x or d.y, then the fill area goes out of the target plane. I only miss one rotation angel (rx), I tried several combinations of trigonometrics, but none of them were correct. Any help would be thankfully appreciaded. If I have solved this problem, I'm ready to share some - I believe - very helpful modules for OpenSCAD. Regards   -- Sent from: http://forum.openscad.org/_______________________________________________ OpenSCAD mailing list [hidden email] http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org
Open this post in threaded view
|

## Re: Span an area between 3 points

 Euler rotations always confuse me so I did it with Frenet-Seret style vector maths. Seems to work.function unit(v) = let(n = norm(v)) n ? v / n : v; // Convert v to a unit vectorfunction orientate(p, r) = // Matrix to translate to p and rotate to r    let(x = r[0], y = r[1], z = r[2])        [[x.x, x.y, x.z, p.x],         [y.x, y.y, y.z, p.y],         [z.x, z.y, z.z, p.z],         [  0,   0,   0, 1  ]];//----------------------------------// WorkInProgress// fill area spanned by p1-p2 and d//----------------------------------module fill(p1,p2,d){    // this is the vector    v=p2-p1;     // length of vector    l=norm(v);     // length of d    h=norm(d);    // angel between v and d is amout to shear    sxy=angel(v,d);        tangent = v;    normal = d;    binormal = cross(tangent, normal);    x = unit(tangent);    z = unit(binormal);    y = -unit(cross(tangent, binormal));    rot = [[x.x, y.x, z.x],           [x.y, y.y, z.y],           [x.z, y.z, z.z]];            multmatrix(orientate(p1, rot) * sxy(sxy)) area(l,h,"p1","p2","p1+d","p2+d"); // DEBUG: show sheared area before translate/rotate #multmatrix(sxy(sxy)) area(l,h,"p1","p2","p1+d","p2+d"); }On Sat, 31 Oct 2020 at 08:38, jjvbhh <[hidden email]> wrote:I have reduced my problem (see Trouble-with-rotating-Text-to-correct-orientation ) to one rotating angel, I cannot find the correct calculation. The task is to span an area between two points P1 and P2 in a direction given by a direction vector D (which is identical to the problem in the subject). The image illustrates it: If you load the attached script ( span-area.scad   ) into OpenSCAD and open the Customizer, you can move P1 and P2 anywhere and the grey fill area is placed perfect. You can also change d.z from the direction vector d. But if you change d.x or d.y, then the fill area goes out of the target plane. I only miss one rotation angel (rx), I tried several combinations of trigonometrics, but none of them were correct. Any help would be thankfully appreciaded. If I have solved this problem, I'm ready to share some - I believe - very helpful modules for OpenSCAD. Regards -- Sent from: http://forum.openscad.org/ _______________________________________________ OpenSCAD mailing list [hidden email] http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org _______________________________________________ OpenSCAD mailing list [hidden email] http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org
Open this post in threaded view
|

## Re: Span an area between 3 points

 Bit more concise version:    binormal = cross(v, d);    x = unit(v);    z = unit(binormal);    y = unit(cross(binormal, v));On Sat, 31 Oct 2020 at 11:47, nop head <[hidden email]> wrote:Euler rotations always confuse me so I did it with Frenet-Seret style vector maths. Seems to work.function unit(v) = let(n = norm(v)) n ? v / n : v; // Convert v to a unit vectorfunction orientate(p, r) = // Matrix to translate to p and rotate to r    let(x = r[0], y = r[1], z = r[2])        [[x.x, x.y, x.z, p.x],         [y.x, y.y, y.z, p.y],         [z.x, z.y, z.z, p.z],         [  0,   0,   0, 1  ]];//----------------------------------// WorkInProgress// fill area spanned by p1-p2 and d//----------------------------------module fill(p1,p2,d){    // this is the vector    v=p2-p1;     // length of vector    l=norm(v);     // length of d    h=norm(d);    // angel between v and d is amout to shear    sxy=angel(v,d);        tangent = v;    normal = d;    binormal = cross(tangent, normal);    x = unit(tangent);    z = unit(binormal);    y = -unit(cross(tangent, binormal));    rot = [[x.x, y.x, z.x],           [x.y, y.y, z.y],           [x.z, y.z, z.z]];            multmatrix(orientate(p1, rot) * sxy(sxy)) area(l,h,"p1","p2","p1+d","p2+d"); // DEBUG: show sheared area before translate/rotate #multmatrix(sxy(sxy)) area(l,h,"p1","p2","p1+d","p2+d"); }On Sat, 31 Oct 2020 at 08:38, jjvbhh <[hidden email]> wrote:I have reduced my problem (see Trouble-with-rotating-Text-to-correct-orientation ) to one rotating angel, I cannot find the correct calculation. The task is to span an area between two points P1 and P2 in a direction given by a direction vector D (which is identical to the problem in the subject). The image illustrates it: If you load the attached script ( span-area.scad   ) into OpenSCAD and open the Customizer, you can move P1 and P2 anywhere and the grey fill area is placed perfect. You can also change d.z from the direction vector d. But if you change d.x or d.y, then the fill area goes out of the target plane. I only miss one rotation angel (rx), I tried several combinations of trigonometrics, but none of them were correct. Any help would be thankfully appreciaded. If I have solved this problem, I'm ready to share some - I believe - very helpful modules for OpenSCAD. Regards -- Sent from: http://forum.openscad.org/ _______________________________________________ OpenSCAD mailing list [hidden email] http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org _______________________________________________ OpenSCAD mailing list [hidden email] http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org
Open this post in threaded view
|

## Re: Span an area between 3 points

 In reply to this post by nophead nophead wrote > Euler rotations always confuse me so I did it with Frenet-Seret style > vector maths. Seems to work. Yes, works fine! Your great, many thanks for your quick response.  This really brings me a giant step forward my targets. Now I only have to understand your magic code. I will come back soon with some fine measure modules Regards -- Sent from: http://forum.openscad.org/_______________________________________________ OpenSCAD mailing list [hidden email] http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org
Open this post in threaded view
|

## Re: Span an area between 3 points

 My code basically sets up a new coordinate system aligned to the vectors and then maps the original plane x, y, z to that new set of axes.On Sat, 31 Oct 2020 at 12:36, jjvbhh <[hidden email]> wrote:nophead wrote > Euler rotations always confuse me so I did it with Frenet-Seret style > vector maths. Seems to work. Yes, works fine! Your great, many thanks for your quick response.  This really brings me a giant step forward my targets. Now I only have to understand your magic code. I will come back soon with some fine measure modules Regards -- Sent from: http://forum.openscad.org/ _______________________________________________ OpenSCAD mailing list [hidden email] http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org _______________________________________________ OpenSCAD mailing list [hidden email] http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org
Open this post in threaded view
|

## Re: Span an area between 3 points

 The new x axis is along v. The new z axis is at right angles to both v and d by taking the cross product. The new y axis is then at right angles to both z and x using another cross product.On Sat, 31 Oct 2020 at 12:38, nop head <[hidden email]> wrote:My code basically sets up a new coordinate system aligned to the vectors and then maps the original plane x, y, z to that new set of axes.On Sat, 31 Oct 2020 at 12:36, jjvbhh <[hidden email]> wrote:nophead wrote > Euler rotations always confuse me so I did it with Frenet-Seret style > vector maths. Seems to work. Yes, works fine! Your great, many thanks for your quick response.  This really brings me a giant step forward my targets. Now I only have to understand your magic code. I will come back soon with some fine measure modules Regards -- Sent from: http://forum.openscad.org/ _______________________________________________ OpenSCAD mailing list [hidden email] http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org _______________________________________________ OpenSCAD mailing list [hidden email] http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org
Open this post in threaded view
|

## Re: Span an area between 3 points

 In reply to this post by nophead On 2020-10-31 12:47, nop head wrote: > Euler rotations always confuse me so I did it with Frenet-Seret style > vector maths. Seems to work. Why such complicated approach? What is wrong with simply adding the vector to the two points to obtain the rectangle area? Carsten Arnholm _______________________________________________ OpenSCAD mailing list [hidden email] http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org
Open this post in threaded view
|

## Re: Span an area between 3 points

 It isn't a rectangle, it is a parallelogram with sheared text on it. On Sat, 31 Oct 2020 at 12:49, <[hidden email]> wrote:On 2020-10-31 12:47, nop head wrote: > Euler rotations always confuse me so I did it with Frenet-Seret style > vector maths. Seems to work. Why such complicated approach? What is wrong with simply adding the vector to the two points to obtain the rectangle area? Carsten Arnholm _______________________________________________ OpenSCAD mailing list [hidden email] http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org _______________________________________________ OpenSCAD mailing list [hidden email] http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org
Open this post in threaded view
|

## Re: Span an area between 3 points

 On 2020-10-31 13:51, nop head wrote: > It isn't a rectangle, it is a parallelogram with sheared text on it. My question still stands if it is a parallelogram Carsten Arnholm _______________________________________________ OpenSCAD mailing list [hidden email] http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org
Open this post in threaded view
|

## Re: Span an area between 3 points

 So what is your solution to construct a transform to rotate and shear a plane to align with an arbitrary parallelogram?On Sat, 31 Oct 2020 at 12:56, <[hidden email]> wrote:On 2020-10-31 13:51, nop head wrote: > It isn't a rectangle, it is a parallelogram with sheared text on it. My question still stands if it is a parallelogram Carsten Arnholm _______________________________________________ OpenSCAD mailing list [hidden email] http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org _______________________________________________ OpenSCAD mailing list [hidden email] http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org
Open this post in threaded view
|

## Re: Span an area between 3 points

 On 2020-10-31 13:58, nop head wrote: > So what is your solution to construct a transform to rotate and shear > a plane to align with an arbitrary parallelogram? The problem was presented with this illustration http://forum.openscad.org/file/t2988/span-area.jpgAs far as I can tell you can do exactly what the figure indicates, add the vector d to each point to arrive at the parallelogram. But maybe I am missing something? Carsten Arnholm _______________________________________________ OpenSCAD mailing list [hidden email] http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org
Open this post in threaded view
|

## Re: Span an area between 3 points

 Yes it would be easy to calculate the forth vector to complete the polygon but then how do you draw it with text, which are 2D operations operating in the XY plane?  On Sat, 31 Oct 2020 at 13:05, <[hidden email]> wrote:On 2020-10-31 13:58, nop head wrote: > So what is your solution to construct a transform to rotate and shear > a plane to align with an arbitrary parallelogram? The problem was presented with this illustration http://forum.openscad.org/file/t2988/span-area.jpg As far as I can tell you can do exactly what the figure indicates, add the vector d to each point to arrive at the parallelogram. But maybe I am missing something? Carsten Arnholm _______________________________________________ OpenSCAD mailing list [hidden email] http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org _______________________________________________ OpenSCAD mailing list [hidden email] http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org
Open this post in threaded view
|

## Re: Span an area between 3 points

 On 2020-10-31 14:10, nop head wrote: > Yes it would be easy to calculate the forth vector to complete the > polygon but then how do you draw it with text, which are 2D operations > operating in the XY plane? I have not studied the details, but obviously you can compute the plane equation from 3 points.  Or even simpler, create a vector from P1 to P2 and compute a couple of cross products (the first with vector d) to arrive at the 3 first columns of the transformation matrix. The fourth is simply choosing an origin. So I thing you can transform the text with the resulting matrix. Carsten Arnholm _______________________________________________ OpenSCAD mailing list [hidden email] http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org
Open this post in threaded view
|

## Re: Span an area between 3 points

 That is pretty much exactly what I did. On Sat, 31 Oct 2020 at 13:22, <[hidden email]> wrote:On 2020-10-31 14:10, nop head wrote: > Yes it would be easy to calculate the forth vector to complete the > polygon but then how do you draw it with text, which are 2D operations > operating in the XY plane? I have not studied the details, but obviously you can compute the plane equation from 3 points.  Or even simpler, create a vector from P1 to P2 and compute a couple of cross products (the first with vector d) to arrive at the 3 first columns of the transformation matrix. The fourth is simply choosing an origin. So I thing you can transform the text with the resulting matrix. Carsten Arnholm _______________________________________________ OpenSCAD mailing list [hidden email] http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org _______________________________________________ OpenSCAD mailing list [hidden email] http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org
Open this post in threaded view
|

## Re: Span an area between 3 points

 Here is a simpler version. Instead of computing the shear and applying it I simply set up the X and Y axes along the edges of the parallelogram and make Z orthogonal to both with a cross product.module fill(p1,p2,d){    // this is the vector    v=p2-p1;        // length of vector    l=norm(v);        // length of d    h=norm(d);       x = unit(v);    y = unit(d);    z = unit(cross(v, d));    m = [[x.x, y.x, z.x, p1.x],         [x.y, y.y, z.y, p1.y],         [x.z, y.z, z.z, p1.z],         [0,   0,   0,   1   ]];              multmatrix(m) area(l,h,"p1","p2","p1+d","p2+d");}On Sat, 31 Oct 2020 at 13:37, nop head <[hidden email]> wrote:That is pretty much exactly what I did. On Sat, 31 Oct 2020 at 13:22, <[hidden email]> wrote:On 2020-10-31 14:10, nop head wrote: > Yes it would be easy to calculate the forth vector to complete the > polygon but then how do you draw it with text, which are 2D operations > operating in the XY plane? I have not studied the details, but obviously you can compute the plane equation from 3 points.  Or even simpler, create a vector from P1 to P2 and compute a couple of cross products (the first with vector d) to arrive at the 3 first columns of the transformation matrix. The fourth is simply choosing an origin. So I thing you can transform the text with the resulting matrix. Carsten Arnholm _______________________________________________ OpenSCAD mailing list [hidden email] http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org _______________________________________________ OpenSCAD mailing list [hidden email] http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org