开发者

Why a graphics overflow problem as a result of a for loop?

开发者 https://www.devze.com 2022-12-24 19:14 出处:网络
using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms;
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D; 

  public class Form1 : System.Windows.Forms.Form
  {

    public static float WXmin;
    public static float WYmin;
    public static float WXmax;  
    public static float WYmax;  
    public static int   VXmin;
    public static int   VYmin;
    public static int   VXmax;
    public static int   VYmax; 
    public static float Wx;
    public static float Wy; 
    public static float Vx; 
    public static float Vy;

    public Form1()
    {
      InitializeComponent();
    }

    private void InitializeComponent()
    {
      this.ClientSize = new System.Drawing.Size(400, 300);
      this.Text="Pass Args";
      this.Paint += new System.Windows.Forms.PaintEventHandler(this.doLine);
      //this.Paint += new System.PaintEventHandler(this.eachCornerPix); 
      //eachCornerPix(out Wx, out Wy, out Vx, out Vy); 
    }

    static void Main() 
    {
      Application.Run(new Form1());
    }

    private void doLine(object sender, System.Windows.Forms.PaintEventArgs e)
    {
      Graphics g = e.Graphics;
      g.FillRectangle(Brushes.White, this.ClientRectangle);
      Pen p = new Pen(Color.Black);
      g.DrawLine(p, 0, 0, 100, 100);  // draw DOWN in y, which is positive since no matrix called
      eachCornerPix(sender, e, out Wx, out 开发者_StackOverflow社区Wy, out Vx, out Vy); 
      p.Dispose();
    }

    private void eachCornerPix (object sender, System.EventArgs e, out float Wx, out float Wy, out float Vx, out float Vy)
    {
      Wx = 0.0f;
            Wy = 0.0f;
            Vx = 0.0f;
            Vy = 0.0f;
      Graphics g = this.CreateGraphics();
      Pen penBlu = new Pen(Color.Blue, 2);
      SolidBrush redBrush = new SolidBrush(Color.Red);
      int width = 2;    // 1 pixel wide in x
      int height = 2;
      float [] Wxc = {0.100f, 5.900f, 5.900f, 0.100f}; 
      float [] Wyc = {0.100f, 0.100f, 3.900f, 3.900f}; 
      Console.WriteLine("Wxc[0] = {0}", Wxc[0]);
      Console.WriteLine("Wyc[3] = {0}", Wyc[3]);
      /*
      for (int i = 0; i<3; i++)
      {
        Wx = Wxc[i];
        Wy = Wyc[i];
        Vx = ((Wx - WXmin)*((VXmax-VXmin)+VXmin)/(WXmax-WXmin));  
            Vy = ((Wy - WYmin)*(VYmax-VYmin)/(WYmax-WYmin)+VYmin); 
            Console.WriteLine("eachCornerPix Vx= {0}", Vx);
            Console.WriteLine("eachCornerPix Vy= {0}", Vy);
            g.FillRectangle(redBrush, Vx, Vy, width, height);
      }  
      */

      // What is there about this for loop that will not run?
      // When the comments above and after the for loop are removed, it gets an overflow?
      g.Dispose();
   }


  }


I'm not sure what a graphics overflow is, but here's a problem with your code. You aren't assigning values to any of your **max and **min variables, so they are all zero. So when you do this:

 Vx = ((Wx - WXmin)*((VXmax-VXmin)+VXmin)/(WXmax-WXmin));  
 Vy = ((Wy - WYmin)*(VYmax-VYmin)/(WYmax-WYmin)+VYmin); 

You are dividing 0f by 0f in both cases, which results in Vx and Vy having an invalid value (NaN - not a number). Graphics.FillRectangle() probably doesn't like being passed NaN.

Also, shouldn't your for loop be going through 4 times? This only goes 3 times:

for (int i = 0; i<3; i++)

You probably meant this:

for (int i = 0; i<=3; i++)
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号