【问题标题】:Calculating the position of points in a circle计算圆中点的位置
【发布时间】:2011-03-14 15:45:42
【问题描述】:

我现在对此有点茫然。 我遇到了一个问题,我需要计算中心点周围的点的位置,假设它们都与中心和彼此等距。

点数是可变的,所以它是DrawCirclePoints(int x) 我确信有一个简单的解决方案,但对于我的生活,我就是看不到它:)

【问题讨论】:

  • 每个人都给出了很好的答案,很快就疯了,所以我给第一个回复打勾:)他们都很棒:)

标签: algorithm math trigonometry geometry


【解决方案1】:

给定半径长度r和角度t(以弧度表示)和圆心(h,k),您可以计算坐标圆周上的一点如下(这是伪代码,你必须适应你的语言):

float x = r*cos(t) + h;
float y = r*sin(t) + k;

【讨论】:

  • 你已经翻转了 cos 和 sin 函数应该是 x 的 sin 和 y 的 cos 。不是相反。
  • 我的数学学位,以及这里的所有其他答案,都说你不正确。
  • 嗯.. 瑞典维基百科上说 sin 是 x 轴我知道这不是安全来源,但后来我在 x 上使用了 sin,在 y 上使用了 cos,我的立方体开始朝着正确的方向移动。甚至我的数学老师也指出我翻转了它们。你能想到为什么我的立方体会以一种奇怪的方式远离目标位置移动然后我翻转它们它移动到它的位置的任何其他原因吗?
  • 这是我写的代码,也许你能说出为什么它可以与翻转它们一起使用? jsfiddle.net/Lf5sZ
  • 在屏幕坐标中,正 y 轴是反转的,所以这是有道理的。
【解决方案2】:

圆心为(x0,y0)、半径为r的圆上的θ角为(x0 + r cos theta, y0 + r sin theta)。现在选择在 0 到 2pi 之间均匀分布的 theta 值。

【讨论】:

  • 经典问题 - pi 的值是 3.14 还是 180? (即角度是度还是弧度?)
  • 绝对是弧度。如果您使用度数,则需要 0 到 360 之间的角度。
  • (当然,不管你喜欢怎么写角度,pi 的值都是 3.14ish。就是这样。)
【解决方案3】:

这是一个使用 C# 的解决方案:

void DrawCirclePoints(int points, double radius, Point center)
{
    double slice = 2 * Math.PI / points;
    for (int i = 0; i < points; i++)
    {
        double angle = slice * i;
        int newX = (int)(center.X + radius * Math.Cos(angle));
        int newY = (int)(center.Y + radius * Math.Sin(angle));
        Point p = new Point(newX, newY);
        Console.WriteLine(p);
    }
}

DrawCirclePoints(8, 10, new Point(0,0)); 的示例输出:

{X=10,Y=0}
{X=7,Y=7}
{X=0,Y=10}
{X=-7,Y=7}
{X=-10,Y=0}
{X=-7,Y=-7}
{X=0,Y=-10}
{X=7,Y=-7}

祝你好运!

【讨论】:

  • 太棒了!对我来说效果很好,我已经将它翻译成 php-cairo 并且效果很好!
  • 我想做同样的任务,但是我的依赖于 Triggertrap/SeekArc · GitHub,当用户移动拇指时,我想放置一个图像来指示选择的进度人......我所尝试的一切都给了我一点点,而不是完美
  • 完美,谢谢!正是我想要的。
【解决方案4】:

使用上述答案之一作为基础,这里是 Java/Android 示例:

protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    RectF bounds = new RectF(canvas.getClipBounds());
    float centerX = bounds.centerX();
    float centerY = bounds.centerY();

    float angleDeg = 90f;
    float radius = 20f

    float xPos = radius * (float)Math.cos(Math.toRadians(angleDeg)) + centerX;
    float yPos = radius * (float)Math.sin(Math.toRadians(angleDeg)) + centerY;

    //draw my point at xPos/yPos
}

【讨论】:

    【解决方案5】:

    在循环路径中放置一个数字

    // variable
    
    let number = 12; // how many number to be placed
    let size = 260; // size of circle i.e. w = h = 260
    let cx= size/2; // center of x(in a circle)
    let cy = size/2; // center of y(in a circle)
    let r = size/2; // radius of a circle
    
    for(let i=1; i<=number; i++) {
      let ang = i*(Math.PI/(number/2));
      let left = cx + (r*Math.cos(ang));
      let top = cy + (r*Math.sin(ang));
      console.log("top: ", top, ", left: ", left);
    }
    

    【讨论】:

      【解决方案6】:

      为了完整起见,您所描述的“点在中心点周围的位置(假设它们都与中心等距)”只不过是“极坐标”。而您正在询问到Convert between polar and Cartesian coordinates 的方式,即x = r*cos(t)y = r*sin(t)

      【讨论】:

        【解决方案7】:

        PHP 解决方案:

        class point{
            private $x = 0;
            private $y = 0;
            public function setX($xpos){
                $this->x = $xpos;
            }
            public function setY($ypos){
                $this->y = $ypos;
            }
            public function getX(){
                return $this->x;
            }
            public function getY(){
                return $this->y;
            }
            public function printX(){
                echo $this->x;
            }
            public function printY(){
                echo $this->y;
            }
        }
        
        function drawCirclePoints($points, $radius, &$center){
            $pointarray = array();
            $slice = (2*pi())/$points;
            for($i=0;$i<$points;$i++){
                $angle = $slice*$i;
                $newx = (int)($center->getX() + ($radius * cos($angle)));
                $newy = (int)($center->getY() + ($radius * sin($angle)));
                $point = new point();
                $point->setX($newx);
                $point->setY($newy);
                array_push($pointarray,$point);
            }
            return $pointarray;
        }
        

        【讨论】:

        • 我认为 $newx$newy 的括号不正确,将坐标 way 放在圆半径之外。尝试$newx = (int)($center-&gt;getX() + ($radius * cos($angle))); 和类似的$newy
        【解决方案8】:

        我必须在网络上这样做,所以这是上面@scottyab's 答案的咖啡脚本版本:

        points = 8
        radius = 10
        center = {x: 0, y: 0}
        
        drawCirclePoints = (points, radius, center) ->
          slice = 2 * Math.PI / points
          for i in [0...points]
            angle = slice * i
            newX = center.x + radius * Math.cos(angle)
            newY = center.y + radius * Math.sin(angle)
            point = {x: newX, y: newY}
            console.log point
        
        drawCirclePoints(points, radius, center)
        

        【讨论】:

          【解决方案9】:

          这是我如何使用 javascript 在圆上找到一个点,计算与圆顶部的角度(度数)。

            const centreX = 50; // centre x of circle
            const centreY = 50; // centre y of circle
            const r = 20; // radius
            const angleDeg = 45; // degree in angle from top
            const radians = angleDeg * (Math.PI/180);
            const pointY = centreY - (Math.cos(radians) * r); // specific point y on the circle for the angle
            const pointX = centreX + (Math.sin(radians) * r); // specific point x on the circle for the angle
          

          【讨论】:

            【解决方案10】:

            这是基于上述@Pirijan 答案的R 版本。

            points <- 8
            radius <- 10
            center_x <- 5
            center_y <- 5
            
            drawCirclePoints <- function(points, radius, center_x, center_y) {
              slice <- 2 * pi / points
              angle <- slice * seq(0, points, by = 1)
            
              newX <- center_x + radius * cos(angle)
              newY <- center_y + radius * sin(angle)
            
              plot(newX, newY)
            }
            
            drawCirclePoints(points, radius, center_x, center_y)
            

            【讨论】:

              【解决方案11】:

              每个点之间的角度将为2Pi/x,因此您可以说对于点n= 0 to x-1,与定义的0点的角度为2nPi/x

              假设您的第一个点位于(r,0)(其中 r 是与中心点的距离),那么相对于中心点的位置将为:

              rCos(2nPi/x),rSin(2nPi/x)
              

              【讨论】:

                【解决方案12】:

                Java 中的工作解决方案:

                import java.awt.event.*;
                import java.awt.Robot;
                
                public class CircleMouse {
                
                /* circle stuff */
                final static int RADIUS = 100;
                final static int XSTART = 500;
                final static int YSTART = 500;
                final static int DELAYMS = 1;
                final static int ROUNDS = 5;
                
                public static void main(String args[]) {
                
                    long startT = System.currentTimeMillis();
                    Robot bot = null;
                
                    try {
                        bot = new Robot();
                    } catch (Exception failed) {
                        System.err.println("Failed instantiating Robot: " + failed);
                    }
                    int mask = InputEvent.BUTTON1_DOWN_MASK;
                
                    int howMany = 360 * ROUNDS;
                    while (howMany > 0) {
                        int x = getX(howMany);
                        int y = getY(howMany);
                        bot.mouseMove(x, y);
                        bot.delay(DELAYMS);
                        System.out.println("x:" + x + " y:" + y);
                        howMany--;
                    }
                
                    long endT = System.currentTimeMillis();
                    System.out.println("Duration: " + (endT - startT));
                
                }
                
                /**
                 * 
                 * @param angle
                 *            in degree
                 * @return
                 */
                private static int getX(int angle) {
                    double radians = Math.toRadians(angle);
                    Double x = RADIUS * Math.cos(radians) + XSTART;
                    int result = x.intValue();
                
                    return result;
                }
                
                /**
                 * 
                 * @param angle
                 *            in degree
                 * @return
                 */
                private static int getY(int angle) {
                    double radians = Math.toRadians(angle);
                    Double y = RADIUS * Math.sin(radians) + YSTART;
                    int result = y.intValue();
                
                    return result;
                }
                }
                

                【讨论】:

                  【解决方案13】:

                  根据以上 Daniel 的回答,这是我对 Python3 的看法。

                  import numpy
                  
                  
                  def circlepoints(points,radius,center):
                      shape = []
                      slice = 2 * 3.14 / points
                      for i in range(points):
                          angle = slice * i
                          new_x = center[0] + radius*numpy.cos(angle)
                          new_y = center[1] + radius*numpy.sin(angle)
                  
                          p = (new_x,new_y)
                          shape.append(p)
                  
                      return shape
                  
                  print(circlepoints(100,20,[0,0]))
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2020-08-10
                    • 2021-09-27
                    • 2012-01-01
                    • 2015-07-11
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多