如何将数值作为曲线进行增减

3
我正在尝试为我的游戏创建一个挖掘工具,我有点A和B的x和y坐标,我想做的是在这些点之间创建一条曲线,没有图形,我只需要循环遍历坐标(float x,float y)。
我不擅长解释,以下是一个视觉示例;

Example

如果我只使用for循环将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);
}

第二张图片是我需要的。
我正在Unity上开发游戏,使用Vector2作为坐标,但这并不重要。 纯C#甚至C++都可以。 如果有人能够解释我所尝试做的事情背后的数学,那也可以。

您有一个半径为50,中心点坐标为(150,100)的半圆。 - jdweng
你的例子有问题,据我理解它实际上没有画出任何东西...不过我看到了你的想法。如果要创建一个“半圆形”(这就是你的“曲线”看起来像的东西),最好想象一下你在-180°和0°之间循环一个小角度变化(你熟悉三角学吗?)。"x的变化"和"y的变化"非常容易用三角函数(正弦和余弦)来表示。如果我没记错的话,对于一个角度,x的小变化应该是-sin(alpha)*radius,y的变化应该是cos(alpha)*radius - Pac0
1
要像你的例子那样做,这意味着单个循环int radius = 50; y = startY; x = startX; for (int alpha = -180; alpha < 0; alpha++) {x += -Mathf.Sin(alpha)*radius; y += Mathf.Cos(alpha)*radius; }。我希望我的三角函数和微积分计算是正确的... 重要 我假设 cossin 实际上使用度数而不是弧度。 - Pac0
由于Unity3D显然使用弧度,因此您需要将“-180”更改为-Mathf.PI,并将alpha ++更改为较小的增量,例如alpha += Mathf.PI / 100 - Pac0
现在,你可以先针对示例坐标在你的情况下进行测试,现在的问题是你想要如何精确地进行泛化?当然,你不希望为你的函数设置任何可想象的参数。 - Pac0
1个回答

1
也许这可以帮助你:

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

请看单位圆

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接