.NET 4.x После рандома рисует только диагональную линию - C#

Узнай цену своей работы

Формулировка задачи:

При инициализации вручную массива точек рисование происходит правильно, но при рандомном заполнении массива рисует только диагональную линию. Пробовал разные рандомы, эта последняя версия от отчаяния пробовал дабловский рандом P.S. кто знает лучший алгоритм нахождения пересекающихся линий пожалуйста помогите
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
 
namespace Площадь_произвольного_многоугольника
{

    public partial class Form1 : Form
    {
        System.Drawing.Graphics Picture;
        Pen pen;
        List<Point> tochki = null;
 
        public double GRX(double max, double min)//рандом для x
        {
            Random random = new Random(DateTime.Now.Millisecond);
            return (random.NextDouble() * (max - min) + min);
        }
 
        /*public int GRY(int y)//рандом для y
        {
            Random random = new Random();
            return (random.Next(y));
        }*/
        public Form1()
        {
            
            InitializeComponent();
            pen = new Pen(Color.Black, 2);
            Picture = pictureBox1.CreateGraphics();
 
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            Picture.Clear(Color.White);
            tochki = new List<Point>();
            if (textBox1.Text == "" || textBox2.Text == "")
            {
                button2.Enabled = false;
                button1.Enabled = false;
            }
            if (tochki.Capacity == 0)
            {
                button4.Enabled = false;
                button1.Enabled = false;
            }
            
        }
 
        public bool peresech (int ax1, int ay1, int ax2, int ay2, int bx1, int by1, int bx2, int by2) // функция проверки на пересечение
        {
            double v1, v2, v3, v4;
            v1 = (bx2 - bx1) * (ay1 - by1) - (by2 - by1) * (ax1 - bx1);
            v2 = (bx2 - bx1) * (ay2 - by1) - (by2 - by1) * (ax2 - bx1);
            v3 = (ax2 - ax1) * (by1 - ay1) - (ay2 - ay1) * (bx1 - ax1);
            v4 = (ax2 - ax1) * (by2 - ay1) - (ay2 - ay1) * (bx2 - ax1);
            bool res = (v1 * v2 < 0) && (v3 * v4 < 0);
            return res;
        }
        private void button3_Click(object sender, EventArgs e)//выход из программы
        {
            Close();
        }
 
        private void button2_Click(object sender, EventArgs e)// добавление точки в массив
        {
            
            tochki.Add(new Point(Convert.ToInt32(textBox1.Text), Convert.ToInt32(textBox2.Text)));
            if (tochki.Count >= 4)
            {
                for (int i = (tochki.Count - 2); i >= 0; i--)
                {
                    for (int j = 0; j <= (tochki.Count - 2); j++)
                    {
                        if (peresech(Convert.ToInt32(tochki[i + 1].X), Convert.ToInt32(tochki[i + 1].Y), Convert.ToInt32(tochki[i].X), Convert.ToInt32(tochki[i].Y), Convert.ToInt32(tochki[j].X), Convert.ToInt32(tochki[j].Y), Convert.ToInt32(tochki[j + 1].X), Convert.ToInt32(tochki[j + 1].Y)) == true)
                        {
                            tochki.RemoveAt(Convert.ToInt32(tochki.Count - 1));
                            MessageBox.Show("Ошибка! Добавление данной точки невозможно. Получившаяся прямая пересекается с другой, пожалуйста введите другие координаты");
                            goto Finish;
                        }
                    }
                }
            }
            Finish:
            if (tochki.Count >= 3)
            {
                button4.Enabled = true;
                button1.Enabled = true;
            }
            textBox1.Clear();
            textBox2.Clear();
           
            /*int j = tochki.Count;
            textBox3.Text = Convert.ToString(j);*/
        }
 
        private void textBox1_TextChanged(object sender, EventArgs e)//проверка не пустоты tb1
        {
            if (textBox1.Text != "" && textBox2.Text != "")
            {
                button2.Enabled = true;
            }
            else
            {
                button2.Enabled = false;
               
            }
        }
 
        private void textBox2_TextChanged(object sender, EventArgs e)//проверка не пустоты tb1
        {
            if (textBox1.Text != "" && textBox2.Text != "")
            {
                button2.Enabled = true;
                
            }
            else
            {
                button2.Enabled = false;

            }
        }
 
        private void button4_Click(object sender, EventArgs e)// рисование 
        {
            Picture.Clear(Color.White);
 
            for (int i=0;i<=(tochki.Count-1);i++)
            {
                if(i< tochki.Count - 1)
                {
                    Picture.DrawLine(pen, tochki[i].X, tochki[i].Y, tochki[i + 1].X, tochki[i + 1].Y);
                }
               
                if(i==tochki.Count-1)
                {
                    Picture.DrawLine(pen, tochki[0].X, tochki[0].Y, tochki[tochki.Count - 1].X, tochki[tochki.Count - 1].Y);
                }
 
            }
           
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
 
        }
 
        private void button5_Click(object sender, EventArgs e)
        {
            Picture.Clear(Color.White);
            tochki.Clear();
            button1.Enabled = false;
            button4.Enabled = false;
        }
 
        private void button6_Click(object sender, EventArgs e)
        {
            
            int vrem1 =Convert.ToInt32(GRX(3.0,5.0));
            double Width1 = pictureBox1.Size.Width;//ширина
            double Height1 = pictureBox1.Size.Height;//высота
            for(int i=0;i<=vrem1;i++)
            {
                int vrem2 = Convert.ToInt32(GRX(0.0, Width1));
                int vrem3 = Convert.ToInt32(GRX(0.0, Height1));
                tochki.Add(new Point(vrem2, vrem3));
                System.Threading.Thread.Sleep(500);
                
            }
           /* tochki.Add(new Point(1, 1));
            tochki.Add(new Point(100, 1));
            tochki.Add(new Point(120, 45));
            tochki.Add(new Point(120, 80));
            tochki.Add(new Point(100, 100));
            tochki.Add(new Point(45, 100));*/
            //button1.Enabled = true; - включить кнопку рассчитать площадь
            button4.Enabled = true;
        }
    }
}

Решение задачи: «.NET 4.x После рандома рисует только диагональную линию»

textual
Листинг программы
        static Random random = new Random();
 
        public double GRX(double max, double min)//рандом для x
        {
            return (random.NextDouble() * (max - min) + min);
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.929 из 5
Похожие ответы