Рассчитать x & y позицию от центральной точки в круге - PullRequest
0 голосов
/ 30 декабря 2018

Мне известно, что этот вопрос задавался ранее, и я проверил много сообщений, и я понимаю, что моя математика недостаточно хороша для решения этой проблемы.

У меня есть круг, который является центральной точкойпри х = 0,0 и у = 0,0.Основываясь на степени 270 в этом примере, я хочу разместить блок x на x & y в указанном градусе от центральной точки.Я просто не могу понять это правильно, даже с примерами, которые я нашел.Ниже приведен текущий код, который я тестирую, а также результат теста на 270 градусов, x-box расположен неправильно, поскольку это не угол 270 градусов.

Буду признателен за любую помощь.

enter image description here

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class testscript : MonoBehaviour
{

    public Image im1, im2;
    public Text im1txt, im2txt, deg;
    private float degree = 270f; 
    private float x, y;


    void Start()
    {
        im1.rectTransform.anchoredPosition = new Vector2(0f, 0f);
        im1txt.text = im1.rectTransform.anchoredPosition.ToString();


        deg.text = degree + " degrees";

        x = 0f + (100 * Mathf.Cos(degree * Mathf.PI / 360f));
        y = 0f + (100 * Mathf.Sin(degree * Mathf.PI / 360f));


        im2.rectTransform.anchoredPosition = new Vector2(x, y);
        im2txt.text = im2.rectTransform.anchoredPosition.ToString();


    }


}

I have tested the two suggestions below and basically get the same result as all the others. Let me visualize the result I get with the last test I done:

const float deg_to_rad = 2f * Mathf.PI / 360f;
    var radians = degree * deg_to_rad;
    x = 0 + Mathf.Cos(radians) * 100;
    y = 0 + Mathf.Sin(radians) * 100;

Here is the result:

[![enter image description here][2]][2]

Solution is, Sin and Cos was swapped. Thanks J.Lengel:

float x = 1f + (100 * Mathf.Sin(angelDegree * Mathf.PI / 180));
float y = -14f + (100 * Mathf.Cos(angelDegree * Mathf.PI / 180));

Ответы [ 4 ]

0 голосов
/ 30 декабря 2018

Попытался добавить это в исходное сообщение, но не смог, поэтому я публикую здесь.

Я проверил вышеупомянутое и получаю те же результаты, что и в большинстве моих предыдущих тестов.Кажется, он работает на 45 и 225 градусов, но не на 90, 180 и 270.

Возможно, моя математическая компетенция потерпела неудачу, и я думаю, что это простая задача.

Последний тест, с которым я прошел, представлен на рисунке.

const float deg_to_rad = 2f * Mathf.PI / 360f;
var radians = degree * deg_to_rad;
x = 0 + Mathf.Cos(radians) * 100;
y = 0 + Mathf.Sin(radians) * 100;
im2.rectTransform.anchoredPosition = new Vector2(x, y); 

Вот последние результаты моих тестов с указанным кодом:

enter image description here

0 голосов
/ 30 декабря 2018

Полный круг (360 градусов) составляет 2 * Пи радианы:

x = 0f + (100 * Mathf.Cos(degree * 2 * Mathf.PI / 360f));
y = 0f + (100 * Mathf.Sin(degree * 2 * Mathf.PI / 360f));
0 голосов
/ 30 декабря 2018
const float deg_to_rad = 2f * Mathf.PI / 360f
var radians = degrees * deg_to_rad;
x = x_orig + Mathf.Cos(radians) * radius;
y = y_orig + Mathf.Sin(radians) * radius;
0 голосов
/ 30 декабря 2018

В ваших Math.cos и Math.sin вы конвертируете из градусов в радианы путем деления на 360. Это не сработает, поскольку 360 градусов - это эквивалент 2pi в радианах, а не pi.Это означает, что вам нужно разделить на 180 или умножить градусы на 2. Надеюсь, это поможет!

Я заметил, что вы берете косинус за х и грех за у.Поменяйте местами это;Вы хотите идти по часовой стрелке, и вы делаете это против часовой стрелки.

x = x_origin + Math.sin(angle) * radius;
y = y_origin + Math.cos(angle) * radius;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...