C# 在VB.NET/C中绘制一个简单的图形#

C# 在VB.NET/C中绘制一个简单的图形#,c#,vb.net,math,graph,C#,Vb.net,Math,Graph,我对此简直是疯了,我花了几个星期的时间试图把它做好,我想我已经筋疲力尽了。每次我得到一个工作模型,并且我改变了最高数字/最低数字,它就会中断,并且屏幕上的东西都会消失 我删除了所有实际运行的代码一百万次,所以这是psuedo代码,但大致上我在做什么,我知道答案是非常明显的 我需要这些数字在客户端区域内进行缩放,并且无论它们是最大值(最大值为9999000,最小值为0.01)还是(最大值为1.00,最小值为0.98),都保持在范围内 最高的数字应该在顶部,最低的数字应该在底部 在迭代之前,我总是知

我对此简直是疯了,我花了几个星期的时间试图把它做好,我想我已经筋疲力尽了。每次我得到一个工作模型,并且我改变了最高数字/最低数字,它就会中断,并且屏幕上的东西都会消失

我删除了所有实际运行的代码一百万次,所以这是psuedo代码,但大致上我在做什么,我知道答案是非常明显的

我需要这些数字在客户端区域内进行缩放,并且无论它们是最大值(最大值为9999000,最小值为0.01)还是(最大值为1.00,最小值为0.98),都保持在范围内

最高的数字应该在顶部,最低的数字应该在底部

在迭代之前,我总是知道最大值和最小值,这些基本上用于缩放图形,因为高/低/cur可以是任何值

我知道上面说的不对,我就是不知道什么是正确的算法来完成我需要的任务。

解决了这个问题。 输出:

求解Y的代数是

(clientrea-(clientrea*(Cur/Max)))

当我和一个没有贡献的人争论时,我把我的价值比作一个进度条,当数学最终击中我的时候。你所做的只是制作一个进度条,而不是画X,Y;你在画Y,X使它垂直

为任何需要它的人测试代码

Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint

        Dim clientArea As Single = PictureBox1.Height

        Dim Max As Single = 1207.43

        Dim g As Graphics = e.Graphics
    
        Dim LastPoint As New Point(0, 0)

        Dim prices As New List(Of Double)
        prices.Add(1207.43)
        prices.Add(1107.2)
        prices.Add(1203.33)
        prices.Add(807.12)
        prices.Add(607.21)
        prices.Add(907.53)
        prices.Add(607.61)
        prices.Add(1000.43)

        For i = 0 To prices.Count - 1
            Cur = prices(i)

            Dim col = i * 100
            Dim y As Single = (clientArea - (clientArea * (Cur / Max)))


            g.FillRectangle(Brushes.Black, New Rectangle(col, y, 10, 10))
            g.DrawString(Cur.ToString, Me.Font, Brushes.Black, New Point(col + 12, y))

            g.DrawLine(Pens.Blue, LastPoint, New Point(col, y))

            LastPoint = New Point(col, y) ' cur vector becomes prev vector for next iteration

        Next

    End Sub

这是我对你要求的最好的猜测。它是一个更新显示例程,具有基于计时器和随机值创建的新当前值

private void updateDisplay(bool clipToMaxMin)
{
    // get the graphics context for the panel
    var g = pnlCanvas.CreateGraphics();
    g.Clear(BackColor);

    // get the min and max width
    var minWidth = g.VisibleClipBounds.Left;
    var maxWidth = g.VisibleClipBounds.Right;
    // get the current width to use
    var curWidth = minWidth + ((maxWidth - minWidth) / 2.0f);

    // get the min and max height
    var minHeight = g.VisibleClipBounds.Bottom;
    var maxHeight = g.VisibleClipBounds.Top;

    // Have to decide if we are going to update max and min or
    // clip the values to max and min
    if(clipToMaxMin)
    {
        current = (current < min) ? min : (current > max) ? max : current;
    }
    else
    {
        if (current > max) max = current;
        else if(current < min) min = current;
   }

   var curScaled = (current - min) / (max - min);
   var curHeight = minHeight + ((maxHeight - minHeight) * (curScaled));

   g.FillEllipse(Brushes.Blue, new RectangleF(curWidth, curHeight, 20, 20));
}
private void updateDisplay(bool-clipToMaxMin)
{
//获取面板的图形上下文
var g=pnlCanvas.CreateGraphics();
g、 清晰(背景色);
//获取最小和最大宽度
var minWidth=g.VisibleClipBounds.Left;
var maxWidth=g.VisibleClipBounds.Right;
//获取要使用的当前宽度
var curWidth=minWidth+((maxWidth-minWidth)/2.0f);
//获取最小和最大高度
var minHeight=g.VisibleClipBounds.Bottom;
var maxHeight=g.VisibleClipBounds.Top;
//必须决定是更新最大值和最小值还是
//将值剪裁为“最大”和“最小”
if(clipToMaxMin)
{
电流=(电流<最小值)?最小值:(电流>最大值)?最大值:电流;
}
其他的
{
如果(电流>最大值)最大值=电流;
否则,如果(电流<最小值)最小值=电流;
}
var curScaled=(当前-最小值)/(最大-最小值);
var curHeight=最小高度+((最大高度-最小高度)*(光标));
g、 FillEllipse(画笔.蓝色,新矩形F(curWidth,curHeight,20,20));
}

屏幕外有哪些内容?当
排列
排列百分比
为常数时,为什么它们的计算在循环中?另外,1.02-0.10=0.92,小于0.99。问题不在于编程语义,正如我所说,这是psuedo代码。我需要这些数字在客户端区域内进行缩放,并保持在最大值(最大值9999000,最小值0.01)或(最大值1.00,最小值0.98)的范围内。正如我所说,我不是在征求编程建议,这是PSUEDO代码。它甚至可能没有编译。@Undefined什么东西在屏幕外?@Undefined对我们不理解这个问题感到沮丧,并不会让我们对尝试帮助感到高兴;)也许这个问题简化得太多了,一些更详细的信息会对我们有所帮助-我们已经好几个星期没有研究它了。你真的需要对
选项设置严格的要求:一些问题会出现,你需要解决:一些奇怪的值会在某个时候出现在这里或那里。使用所有
矩形F
和所有
点F
。通过事先变换(x,y)图形原点向量,可以在每次迭代中删除计算(
Dim y As Single=…
)。即使这个过程可能不是性能关键的,但在将来也要记住它(对于混合的双精度/浮点值,每次迭代的除法和乘法会花费很多)。您必须重新计算此值:
Dim col=i*100
private void updateDisplay(bool clipToMaxMin)
{
    // get the graphics context for the panel
    var g = pnlCanvas.CreateGraphics();
    g.Clear(BackColor);

    // get the min and max width
    var minWidth = g.VisibleClipBounds.Left;
    var maxWidth = g.VisibleClipBounds.Right;
    // get the current width to use
    var curWidth = minWidth + ((maxWidth - minWidth) / 2.0f);

    // get the min and max height
    var minHeight = g.VisibleClipBounds.Bottom;
    var maxHeight = g.VisibleClipBounds.Top;

    // Have to decide if we are going to update max and min or
    // clip the values to max and min
    if(clipToMaxMin)
    {
        current = (current < min) ? min : (current > max) ? max : current;
    }
    else
    {
        if (current > max) max = current;
        else if(current < min) min = current;
   }

   var curScaled = (current - min) / (max - min);
   var curHeight = minHeight + ((maxHeight - minHeight) * (curScaled));

   g.FillEllipse(Brushes.Blue, new RectangleF(curWidth, curHeight, 20, 20));
}