How can I generate a set of points evenly distributed along the perimeter of an ellipse?

后端 未结 8 725
庸人自扰
庸人自扰 2020-12-15 22:28

If I want to generate a bunch of points distributed uniformly around a circle, I can do this (python):

r = 5  #rad         


        
8条回答
  •  悲哀的现实
    2020-12-15 22:42

    This is an old thread, but since I am seeking the same task of creating evenly spaced points along and ellipse and was not able to find an implementation, I offer this Java code that implements the pseudo code of Howard:

     package com.math;
    
      public class CalculatePoints {
    
      public static void main(String[] args) {
        // TODO Auto-generated method stub
    
        /*
         * 
            dp(t) = sqrt( (r1*sin(t))^2 + (r2*cos(t))^2)
            circ = sum(dp(t), t=0..2*Pi step 0.0001)
    
            n = 20
    
            nextPoint = 0
            run = 0.0
            for t=0..2*Pi step 0.0001
                if n*run/circ >= nextPoint then
                    set point (r1*cos(t), r2*sin(t))
                    nextPoint = nextPoint + 1
                next
                run = run + dp(t)
            next
         */
    
    
        double r1 = 20.0;
        double r2 = 10.0;
    
        double theta = 0.0;
        double twoPi = Math.PI*2.0;
        double deltaTheta = 0.0001;
        double numIntegrals = Math.round(twoPi/deltaTheta);
        double circ=0.0;
        double dpt=0.0;
    
        /* integrate over the elipse to get the circumference */
        for( int i=0; i < numIntegrals; i++ ) {
            theta += i*deltaTheta;
            dpt = computeDpt( r1, r2, theta);
            circ += dpt;
        }
        System.out.println( "circumference = " + circ );
    
        int n=20;
        int nextPoint = 0;
        double run = 0.0;
        theta = 0.0;
    
        for( int i=0; i < numIntegrals; i++ ) {
            theta += deltaTheta;
            double subIntegral = n*run/circ;
            if( (int) subIntegral >= nextPoint ) {
                double x = r1 * Math.cos(theta);
                double y = r2 * Math.sin(theta);
                System.out.println( "x=" + Math.round(x) + ", y=" + Math.round(y));
                nextPoint++;
            }
            run += computeDpt(r1, r2, theta);
        }
    }
    
    static double computeDpt( double r1, double r2, double theta ) {
        double dp=0.0;
    
        double dpt_sin = Math.pow(r1*Math.sin(theta), 2.0);
        double dpt_cos = Math.pow( r2*Math.cos(theta), 2.0);
        dp = Math.sqrt(dpt_sin + dpt_cos);
    
        return dp;
    }
    
    }
    

提交回复
热议问题