Show messages:
1-15
16-22
From: wayne hill (WAYNEHILL5202)
Question:
How to programmatically determine an arc object direction (cw/ccw) given the vector dir?
Thank you,
Wayne
code:
if (moi.majorVersionNumber >= 4) {
var segs = crv.getSubObjects();
for (var j = 0; j < segs.length; ++j) {
var seg = segs.item(j);
var min = seg.domainMin;
var max = seg.domainMax;
var len = max - min;
for (var k = 0; k < 2; ++k) {
var t = min + (k / 2 * len);
var pt = seg.evaluatePoint(t);
var dir = seg.evaluateTangent(t);
// ccw boolean > true/false ?
var arrow = CreateArrow(pt, dir);
if (arrow) {
arrow.setHitTest(false);
dirs.addObject(arrow);
}
}
}
}
From: bemfarmer
Using a right handed helix as an example of the initial curve, say a threaded rod:
Consider an arbitrary point on the helix.
Rotate of the rod, or have the point travel along the helix.
Whether the point is traveling cw or ccw, or..., depends upon the view.
But the curve remains right handed.
- Brian
Maybe use tangent as view direction?
normal and binormal?
I do not understand the cw, ccw question. Maybe some other criterion is needed?
From: wayne hill (WAYNEHILL5202)
Hi Brian,
I am working on a project to draw MoI objects to a html canvas.
The html arcs/circles use clockwise and counterclockwise to determine the start and end direction of the arc.
https://www.w3schools.com/tags/canvas_arc.asp
The direction of the arc would also be used within a path for a motion controller. or simple G Code output for CNC machines.
I tried using a cross product from the points. My program logic did not work for some reason. Looking for a rotational cross product for better results.
Thank you,
Wayne
From: Michael Gibson
Hi Wayne, are these arcs all in the world x/y plane (the Top view's plane)?
So the concept of being CW or CCW is with respect to a plane normal, so I think you'll need to incorporate that.
See if this makes sense:
So you have a point on the arc, and the tangent vector. Make a second vector from the point on the arc to the arc's center point.
If you now take the CrossProduct( tangent, towards_center_vector ), that will generate a normal, either the same as your plane normal for the CCW arc, or opposite it for the CW arc. When comparing normals it's not a good idea to test for total equality, due to tiny roundoffs in floating point mathematics you can easily end up with values like 0.00000000000001 instead of 0, so you want to allow some epsilon/tolerance slack in your test.
Something like:
var eps = 1.0e-10;
function IsEqual( x, y )
{
return Math.abs( x - y ) < eps;
}
function IsEqual( vec1, vec2 )
{
return IsEqual( vec1.x, vec2.x ) && IsEqual( vec1.y, vec2.y ) && IsEqual( vec1.z, vec2.z );
}
Or another way you can compare normalized vectors is by dotproduct between them which gives the cosine of the angle between them. So something like
function VectorsAreSameDir( vec1, vec2 )
{
return DotProduct( vec1 /*normalized*/, vec2 /*normalized*/ ) > 0.99984769515639123915 (this number is the cosine of 1 degree).
}
Let me know if that doesn't do what you need.
- Michael
Image Attachments:
wayne_arc_direction.jpg
From: Michael Gibson
Hi Wayne, another way you can determine the direction just using 2D points is to make a 2D triangle and then compute the signed area of the triangle:
https://www.quora.com/What-is-the-signed-Area-of-the-triangle?share=1
It will be a positive number for CCW, and a negative number for CW.
- Michael
From: wayne hill (WAYNEHILL5202)
Hi Michael,
Yes, I am only using the top view plane. The methods you suggested will be looked at in closer detail.
Thank you.
Wayne
From: pressure (PEER)
Here's a small update to the orderCurves plugin that works on curves smaller than 1 unit long.
Attachments:
orderCurves.zip
Show messages:
1-15
16-22