現時点ではこれについて少し心が空いています。それらがすべて中心から、そして互いから等距離にあると仮定して、中心点の周りの点の位置を計算する必要があるという問題を抱えています。
ポイントの数は可変なので、DrawCirclePoints(int x)
になります。簡単な解決策があるはずですが、私の人生では、それを見ることができません:)
中心が(x0,y0)
で半径がr
である円上の角度thetaの点は(x0 + r cos theta, y0 + r sin theta)
です。 0から2piの間で等間隔に配置されたtheta
値を選択します。
半径の長さrと角度tラジアンと円の中心(h、k)を指定すると、点の座標を計算できます次のように円周上にあります(これは擬似コードです。言語に合わせて調整する必要があります)。
float x = r*cos(t) + h;
float y = r*sin(t) + k;
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}
_
幸運を!
上記の回答の1つをベースとして使用して、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
}
私はこれをウェブ上でやらなければならなかったので、上記の@ scottyab's answerのコーヒースクリプト版があります:
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)
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;
}
完成のために、「中心点の周りの点の位置(それらはすべて中心から等距離にあると仮定)」とは、「極座標」に他なりません。そして、あなたは 極座標とデカルト座標間の変換 への道を求めています。これはx = r*cos(t)
、y = r*sin(t)
として与えられます。
各ポイント間の角度は2Pi/x
だからあなたはポイントn= 0 to x-1
定義された0点からの角度は2nPi/x
。
最初のポイントが(r,0)
(rは中心点からの距離)、中心点からの相対位置は次のようになります。
rCos(2nPi/x),rSin(2nPi/x)
上記の@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)
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;
}
}
ダニエルからの上記の回答に基づいて、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]))
数字を円形のパスに配置する
// 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);
}