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 :)
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.
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;
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!
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
}
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)
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;
}
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)
.
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)
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;
}
}
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)
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]))
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);
}