एक सर्कल में बिंदुओं की स्थिति की गणना करना


88

मैं इस समय इस पर थोड़ा दिमाग खाली कर रहा हूं। मुझे एक समस्या मिली है जहां मुझे एक केंद्रीय बिंदु के आसपास बिंदुओं की स्थिति की गणना करने की आवश्यकता है, यह मानते हुए कि वे केंद्र से और एक-दूसरे से सभी समतुल्य हैं।

अंकों की संख्या परिवर्तनशील है, इसलिए DrawCirclePoints(int x) मुझे यकीन है कि एक सरल समाधान है, लेकिन मेरे जीवन के लिए, मैं इसे नहीं देख सकता हूं :)


1
सभी ने शानदार जवाब दिए, पागल जल्दी, इसलिए मैंने पहली प्रतिक्रिया को टिक दिया :) वे सभी महान थे :)
जोब्रोर्न

जवाबों:


74

वृत्त पर कोण थीटा का एक बिंदु जिसका केंद्र है (x0,y0)और जिसका त्रिज्या rहै (x0 + r cos theta, y0 + r sin theta)। अब thetaमानों को समान रूप से 0 और 2pi के बीच रखें।


क्लासिक सवाल- pi का मूल्य 3.14 या 180 है? (यानी नीचे या रेडियन में कोण है?)
nirvanaswap

निश्चित रूप से रेडियन। यदि आप डिग्री का उपयोग करते हैं, तो आपको इसके बजाय 0 और 360 के बीच के कोणों की आवश्यकता होती है।
गैरेथ मैककॉघन

8
(पीआई का मूल्य ३.१४ है, इस बात की परवाह किए बिना कि आप कोण कैसे लिखना पसंद करते हैं। निश्चित रूप से यह वही है।)
गैरेथ मैककॉघन १३'१

89

एक त्रिज्या लंबाई आर और रेडियन में एक कोण टी और एक वृत्त केंद्र (एच, के) को देखते हुए , आप परिधि पर एक बिंदु के निर्देशांक की गणना इस प्रकार कर सकते हैं (यह छद्म कोड है, आपको इसे अपने अनुकूल करना होगा। भाषा: हिन्दी):


आप कॉस फ़्लिप कर चुके हैं और पाप कार्य x के लिए पाप और वाई के लिए कॉस होना चाहिए। कोई और रास्ता नही।
एंड्रियास

18
गणित में मेरी डिग्री, साथ ही यहां हर दूसरे जवाब में कहा गया है कि आप गलत हैं।
ब्रायन ड्रिस्कॉल

2
हम्म .. अच्छी तरह से सिन विकिपीडिया पर यह कहता है कि पाप x अक्ष है मुझे पता है कि यह सुरक्षित स्रोत नहीं है, लेकिन फिर मैंने x पर पाप का इस्तेमाल किया और y पर मेरा क्यूब सही दिशा में बढ़ने लगा। यहां तक ​​कि मेरे गणित शिक्षक ने बताया कि मैंने उन्हें फ़्लिप किया। क्या आप किसी अन्य कारण के बारे में सोच सकते हैं कि मेरा क्यूब लक्ष्य स्थान से दूर एक अजीब पैटर्न में क्यों चला जाएगा और फिर मैंने उन्हें फ़्लिप किया यह स्थिति के लिए चलता है?
एंड्रियास

यह वह कोड है जो मैंने लिखा था शायद आप बता सकते हैं कि यह उनके साथ क्यों काम करता है? jsfiddle.net/Lf5sZ
एंड्रियास

3
स्क्रीन में निर्देशांक सकारात्मक y- अक्ष उलट है, ताकि समझ में आता है।
ब्रायन ड्रिस्कॉल

52

यहाँ 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
अति उत्कृष्ट! मेरे लिए महान काम किया, मैंने पहले ही इसे php-cairo में अनुवाद किया और महान काम किया!
मेल्सी

मैं एक ही तरह का कार्य करना चाह रहा हूं, हालांकि मेरा ट्रिग्गरट्रैप / सीकैंस · गिटहब पर निर्भर है, जब कोई उपयोगकर्ता अंगूठे को घुमाता है, तो मैं उस व्यक्ति की चयनित प्रगति को इंगित करने के लिए एक छवि रखना चाहता हूं .... यह सब मैं कर रहा हूं। मुझे अंक थोड़ा दूर करने की कोशिश की और एक पूर्ण नहीं
Ruyonga Dan

1
बहुत बहुत धन्यवाद! मुझे इसकी ही खोज थी।
पैट्रिक हुंड

9

आधार के रूप में उपरोक्त उत्तरों में से एक का उपयोग करते हुए, यहां जावा / एंड्रॉइड उदाहरण है:

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
}

4

एक वृत्ताकार पथ में एक संख्या रखते हुए

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

3

मुझे यह वेब पर करना था, इसलिए यहां @ scottyab के उत्तर का एक कॉफ़ीस्क्रिप्ट संस्करण है :

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

पूरा होने के लिए, आप "केंद्रीय बिंदु के चारों ओर बिंदुओं की स्थिति" के रूप में क्या वर्णन करते हैं (यह मानते हुए कि वे केंद्र से सभी समान हैं) "पोलर निर्देशांक" के अलावा कुछ भी नहीं है। और आप ध्रुवीय और कार्टेशियन निर्देशांक के बीच कन्वर्ट करने के लिए रास्ता पूछ रहे हैं जो कि x = r*cos(t), के रूप में दिया गया है y = r*sin(t)


3

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, सर्कल के दायरे के बाहर निर्देशांक रास्ता डाल रहा है । कोशिश करो $newx = (int)($center->getX() + ($radius * cos($angle)));और इसी तरह के लिए $newy
जेसन

1

आपके प्रत्येक बिंदु के बीच का कोण 2Pi/xऐसा होने वाला है जिससे आप कह सकते हैं कि बिंदुओं के n= 0 to x-1लिए परिभाषित 0 बिंदु से कोण है 2nPi/x

मान लें कि आपका पहला बिंदु है (r,0)(जहाँ r केंद्र बिंदु से दूरी है) तो केंद्रीय बिंदु के सापेक्ष स्थिति निम्नानुसार होगी:

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

1

जावा में कार्य समाधान:

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

यहाँ Rऊपर @Pirijan उत्तर पर आधारित एक संस्करण है।

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

यहां बताया गया है कि मुझे जावास्क्रिप्ट के साथ एक सर्कल पर एक बिंदु कैसे मिला, सर्कल के शीर्ष से कोण (डिग्री) की गणना।

  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

0

डैनियल से ऊपर के जवाब के आधार पर, यहाँ मेरा पायथन 3 का उपयोग कर रहा है।

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]))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.