Как уменьшать и увеличивать значения в виде кривой - PullRequest
3 голосов
/ 04 августа 2020

Я пытаюсь сделать инструмент для копания для своей игры, у меня есть координаты x и y точек A и B, я хочу создать кривую между этими точками, ничего графического, мне просто нужно l oop через координаты (float x, float y).

Я не умею объяснять, поэтому вот наглядный пример;

пример

Первое изображение - это то, что произойдет, если я просто использую a для l oop, чтобы уменьшить значение y до середины, а затем увеличить его от середины до конца.

//Very specific code for my example 
//I wrote it just for this example so I am not sure if it works

float y;
float x;

public void Example(float startX, float endX, float startY, float endY, float depth)
{
    y = startY;
    x = startX;
    float changeAmountOfY = depth / (endX - startX);

    for (int i = (int)startX; i < (startX + endX) / 2; i++)
    {
        x++;
        y -= changeAmountOfY; 
    }

    for (int i = (int)(startX + endX) / 2; i < endX; i++)
    {
        x++;
        y += changeAmountOfY;
    }
}

public void ChangeCoordinates()
{
    Example(100f, 200f, 100f, 100f, 50f);
}

Мне нужно второе изображение.

Я разрабатываю игру на единстве и использую Vector2 для координат, но это не важно. Чистый C# или даже C ++ приветствуется. Также хорошо, если кто-то может просто объяснить математику того, что я пытаюсь сделать.

1 Ответ

1 голос
/ 04 августа 2020

Может быть, это поможет:

// Calculate radius
int radius = (B.X - A.X) / 2;

// Calculate middle
int middle_x = A.X + radius;
int middle_y = A.Y;
// or
int middle_y = (A.Y + B.Y) / 2;


// Coordinates for a semicircle
// 0 to 180 degree
for (int i = 0; i <= 180; i++)
{
  double x_coordinate = middle_x + radius * Math.Cos(i * Math.PI / 180);

  // Opened to bottom
  double y_coordinate = middle_y + radius * Math.Sin(i * Math.PI / 180);

  // or opened to top
  double y_coordinate = middle_y - radius * Math.Sin(i * Math.PI / 180);
}

Взгляните на единичный круг .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...