从正负笛卡尔输入值计算屏幕坐标

3

我有两个整数值需要转换为屏幕坐标(双精度浮点数)的两个方向。将分数值(-50到50)转换为屏幕坐标(如下面的示例代码所示,一个屏幕300 x 300点/像素),同时也需要进行屏幕到分数值的转换。我已经画了一个视觉示例:

enter image description here

我还创建了一个小型控制台应用程序来测试计算,但显然目前完全不起作用,我真的很难处理数学问题。

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

1
“显然目前根本不起作用” <--- 显然?我想你必须启发我们。 到底哪里出了问题? 如果您遇到的问题是数学问题而不是编程问题,那么这可能不是提问的正确场所(请尝试数学堆栈交换)。 - rory.ap
@MsYvette,是的,那就是我们的想法。 - Jammer
@roryap我真的不确定我能为此添加什么,所有的方法和输入以及预期输出都已定义。 - Jammer
2个回答

1
您可以将以下函数添加到您的代码中,以将标记值转换为屏幕上的位置。
这是为了将您的分数计算到屏幕上。
使用screenheight作为最大屏幕高度和screenwidth作为最大屏幕宽度,您可以在屏幕上显示您的标记。您可以将您的标记的最大/最小值或50互换为任何变量,就像我已经将屏幕宽度/高度变量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;

如果minX为-10且maxX为77怎么办?当这些值发生更改时,您可能需要更新所有公式/条件。 - serhiyb
@MsYvette,serhiyb所选的答案非常出色,代码格式更加简洁。 - Jammer

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

这几乎是正确的,问题在于一个计算错误了 - 屏幕 Y:75 - 得分:-25,这应该导致得分为25。 - Jammer
1
哦,对了,你的Y轴方向相反。我现在会更新我的答案。 - serhiyb
再试一次。 - serhiyb
我知道这要求有点高,但我正在查看代码以更好地理解它。在这个式子中,屏幕高度(screenHeight)和(scoreY - minY)/(maxY-minY)*screenHeight之间的优先顺序是什么?我假设结合律在某处发挥了作用? - Jammer
1
首先计算(scoreY - minY)/(maxY-minY),可以将其视为百分比。这表示高度的使用量。然后我们将其乘以screenHeight,以将百分比转换为实际的Y坐标。最后,我们执行screenHeight - Y来获取翻转的值,因为轴是相反的。 - serhiyb
非常感谢。像这样的时候让我想起了我还有很多不懂,以为自己懂了的东西! - Jammer

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