从 +/- 笛卡尔输入值计算屏幕坐标

Calculating Screen Coordinates from +/- Cartesian Input Values

我有两个整数值需要在两个方向上转换为屏幕坐标(双精度)。筛选值(-50 到 50)(如以下示例代码所示,屏幕 300 x 300 points/pixels)和筛选值。我画了一个可视化的例子:

我还创建了一个小型控制台应用程序来测试目前显然根本不起作用的计算,我真的在数学上苦苦挣扎。

class Program
{
    public static void Main(string[] args)
    {
        double screenWidth = 300;
        double screenHeight = 300;

        double MaxX = 50;
        double MinX = -50;

        double MaxY = 50;
        double MinY = -50;

        // x = 150
        // y = 150
        // given these inputs
        CalcScoreToScreen(screenWidth, screenHeight, 0, 0);

        // x = 300
        // y = 0
        // given these inputs
        CalcScoreToScreen(screenWidth, screenHeight, 50, 0);

        // x = 225
        // y = 225
        // given these inputs
        CalcScoreToScreen(screenWidth, screenHeight, 25, -25);

        // x = 75
        // y = 75
        // given these inputs
        CalcScoreToScreen(screenWidth, screenHeight, -25, 25);

        // x = -25
        // y = 25
        // given these inputs
        CalcScreenToScore(screenWidth, screenHeight, 75, 75);

        // x = 25
        // y = -25
        // given these inputs
        CalcScreenToScore(screenWidth, screenHeight, 225, 225);

        Console.ReadLine();
    }

    private static void CalcScoreToScreen(double screenWidth, double screenHeight, int scoreX, int scoreY)
    {
        var screenX = scoreX + screenWidth / 2;

        var screenY = scoreY + screenHeight / 2;

        Console.WriteLine("Screen X: {0} - Score: {1}", screenX, scoreX);
        Console.WriteLine("Screen Y: {0} - Score: {1}", screenY, scoreY);
    }

    private static void CalcScreenToScore(double screenWidth, double screenHeight, double screenX, double screenY)
    {
        int scoreX = Convert.ToInt32(screenX + screenWidth / 2);
        int scoreY = Convert.ToInt32(screenY + screenHeight / 2);

        Console.WriteLine("Score X: {0} - Screen X: {1}", scoreX, screenX);
        Console.WriteLine("Score Y: {0} - Screen Y: {1}", scoreY, screenY);
    }
}

您可以将此函数添加到您的代码中,以将标记的值转换为屏幕上的位置。

这是为了计算您的筛选分数。

将 screenheight 用作最大屏幕高度,将 screenwidth 用作最大屏幕宽度,以图形方式显示标记。然后,您可以将标记的 max/min 值或 50 互换为任何变量,因为我已将屏幕 width/height 变量设为 300 并将其设为变量。

值范围为 100:-50 到 50。 对于 X: 所以负值覆盖屏幕的前 50%,正值覆盖第二个 50%

if(Xvalue == 0)
    screenXPos = Screenwidth/2;

else if(Xvalue < 0)
    screenXPos = Screenwidth/2 + Screenwidth/2*Xvalue/50; // this will be negative so subtract from half screenwidth.

else
    screenXPos = Screenwidth*Xvalue/50;

Y:

负值是从最大屏幕高度到半屏幕高度正值是从半屏幕高度到零。

if(Yvalue == 0)
    screenYPos = Screenheight/2;

else if(Yvalue < 0)
    screenYPos = screenheight/2 -Screenheight/2*Yvalue/50; // don't want negative value for screen position.

else
    screenYPos = screenheight/2*Yvalue/50;
private static void CalcScoreToScreen(double screenWidth, double screenHeight, int scoreX, int scoreY, double minX, double maxX, double minY, double maxY)
{
    var screenX = (scoreX - minX)/(maxX-minX)*screenWidth;
    var screenY = screenHeight - (scoreY - minY)/(maxY-minY)*screenHeight;

    Console.WriteLine("Screen X: {0} - Score: {1}", screenX, scoreX);
    Console.WriteLine("Screen Y: {0} - Score: {1}", screenY, scoreY);
}

private static void CalcScreenToScore(double screenWidth, double screenHeight, double screenX, double screenY, double minX, double maxX, double minY, double maxY)
{
    int scoreX = Convert.ToInt32(minX + (maxX-minX)*screenX/screenWidth );
    int scoreY = Convert.ToInt32(minY + (maxY-minY)*(screenHeight - screenY)/screenHeight );

    Console.WriteLine("Score X: {0} - Screen X: {1}", scoreX, screenX);
    Console.WriteLine("Score Y: {0} - Screen Y: {1}", scoreY, screenY);
}