web-dev-qa-db-fra.com

Calculer la position des points dans un cercle

Je suis un peu vide d'esprit à ce sujet pour l'instant ... J'ai un problème où je dois calculer la position des points autour d'un point central, en supposant qu'ils soient tous à égale distance du centre et de L'un et l'autre.

Le nombre de points est variable, il s'agit donc de DrawCirclePoints(int x) Je suis sûr qu'il existe une solution simple, mais pour la vie, je ne la vois pas :)

70
JoeBrown

Un point d'angle thêta sur le cercle dont le centre est (x0,y0) et le rayon r est (x0 + r cos theta, y0 + r sin theta). Maintenant, choisissez theta valeurs uniformément espacées entre 0 et 2pi.

58
Gareth McCaughan

Soit une longueur de rayon r et un angle t en radians et le centre d'un cercle (h, k) , vous pouvez calculer les coordonnées d'un point de la circonférence de la manière suivante (pseudo -code, vous devrez l’adapter à votre langue):

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

Voici une solution utilisant 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);
    }
}

Exemple de sortie de 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}

Bonne chance!

47
Daniel Lidström

En utilisant l'une des réponses ci-dessus comme base, voici l'exemple de 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
}
9
scottyab

Je devais le faire sur le Web, alors voici une version coffeescript de @ scottyab's answer ci-dessus:

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)
3
Pirijan

Solution 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;
}
2
bitmous

Par souci d’achèvement, ce que vous décrivez comme "la position des points autour d’un point central (en supposant qu’ils soient tous à égale distance du centre)" n’est rien que des "coordonnées polaires". Et vous demandez le moyen de Convertir entre les coordonnées polaires et cartésiennes qui est donné par x = r*cos(t), y = r*sin(t).

2
Adarsha

Voici une version R basée sur la réponse @Pirijan ci-dessus.

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)
1
jsta

Solution de travail en 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;
}
}
1
Gewure

L'angle entre chacun de vos points va être 2Pi/x. Vous pouvez donc dire que pour les points n= 0 to x-1, l'angle d'un point 0 défini est 2nPi/x.

En supposant que votre premier point est à (r,0) (où r est la distance du point central), les positions par rapport au point central seront:

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

Basé sur la réponse ci-dessus de Daniel, voici ma prise en utilisant Python3.

import numpy

shape = []
def circlepoints(points,radius,center):
    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]))
0
Pratik

Placer un numéro dans une trajectoire circulaire

// 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);
}
0
maSC0d3R