Jump to content
ikoon

arc from three points (vex)

Recommended Posts

Please, do you have a vex code for creating Arc from 3 points?
From time to time it would be useful to have it.

AndrewVK shared this C++ source here:
https://www.sidefx.com/forum/topic/19104/?page=1#post-89849

I could rewrite it as an exercise and then I will share it ... but if anybody has it done, it would be a great time saver.

Share this post


Link to post
Share on other sites

Tesan, thank you very much for your hip file! Please, do you anybody have also a solution for a circular arc?

 


Here is a screenshot from the file, for a future reference:

image.thumb.png.290bcff6d522f698c97e210f657a352e.png

 

And the complete wrangle is:

// Convert the umap range from 0-1 to 0-1-0
float curveToHalf(
        float value;
        ) {

        return clamp(value, 0, 0.5) * clamp(fit(value, 0, 1, 1, 0) , 0, 0.5) * 4;
}
// Complement function
float complement(
        float value;
        ) {

        return 1 + (value * -1);
}
// Main interpolation function
float interpolate_curve(
        float value;
        string sign;
        ) {

        float pi_half = 1.57079632679;

        value = cos(value * pi_half);

        if ( sign == "-" )
                return 1 + (value * -1);
        else
                return value;

}
// Get user parameters from the UI
string  sign            = ch("sign");
int             complement      = int(ch("complement"));
int             curve_half      = int(ch("curve_half"));

// Create our classic umap attribute ranging over the points from 0-1
float   umap = float(@ptnum) / (npoints(@OpInput1) - 1);

// Convert the umap range
if ( curve_half == 1)
        umap = curveToHalf(umap);

// Do the complement for the umap
if ( complement == 1)
        umap = complement(umap);

// Interpolate curve based on the parameters
@P.y = interpolate_curve(umap, sign);

 

Share this post


Link to post
Share on other sites

I have 100 % somewhere more files ..just need to find :ph34r: ..and those  vex codes don't know Owner :wub:

  • Like 1

Share this post


Link to post
Share on other sites

Hi Jiri,

to get started I just wrote a script that turns a bunch of lines with three points into circles:

circles_by_three_points.gif.670ea683eb5b87b508b569e328b7ed54.gif

It's basically calculating the intersection point and radius of rectangular vectors starting from the lines' midpoints. To be run in a primitive wrangle:

// 3D INTERSECTION
// https://stackoverflow.com/questions/10551555/need-an-algorithm-for-3d-vectors-intersection
function vector intersection(vector r1, r2, e1, e2){
    float u = dot(e1, e2);
    float t1 = dot(r2 - r1, e1);
    float t2 = dot(r2 - r1, e2);
    float d1 = (t1 - u * t2) / (1 - u * u);
    float d2 = (t2 - u * t1) / (u * u - 1);
    vector p1 = r1 + e1 * d1;
    vector p2 = r2 + e2 * d2;
    vector pos_center = (p1 + p2) * 0.5;
    return pos_center;
}

// INPUT POSITIONS
int pt_0 = primpoint(0, i@primnum, 0);
int pt_1 = primpoint(0, i@primnum, 1);
int pt_2 = primpoint(0, i@primnum, 2);

vector pos_A = point(0, 'P', pt_0);
vector pos_B = point(0, 'P', pt_1);
vector pos_C = point(0, 'P', pt_2);

vector mid_AB = (pos_A + pos_B) * 0.5;
vector mid_BC = (pos_B + pos_C) * 0.5;

// DIRECTIONS
vector dir_BA = normalize(pos_B - pos_A);
vector dir_BC = normalize(pos_B - pos_C);
vector dir_rect = normalize(cross(dir_BA, dir_BC));
vector dir_BA_rect = normalize(cross(dir_BA, dir_rect));
vector dir_BC_rect = normalize(cross(dir_BC, dir_rect));

// ADD CIRCLE
vector pos_center = intersection(mid_AB, mid_BC, dir_BA_rect, dir_BC_rect);
float radius = distance(pos_center, pos_A);
int pt_add = addpoint(0, pos_center);
int circle_add = addprim(0, 'circle', pt_add);
matrix3 xform_circle = dihedral({0,0,1}, dir_rect);
scale(xform_circle, radius);
setprimintrinsic(0, 'transform', circle_add, xform_circle);

// REMOVE INPUT GEOMETRY
removeprim(0, i@primnum, 1);

 

circles_from_points.hipnc

  • Like 2
  • Thanks 2

Share this post


Link to post
Share on other sites

Oh this is great, excellent. Thank you very much guys!!!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×