Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/25: Рейтинг темы: голосов - 25, средняя оценка - 4.72
0 / 0 / 0
Регистрация: 10.04.2013
Сообщений: 7

Нахождение точек пересечения отрезков

10.04.2013, 13:39. Показов 4784. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
в общем,запара возникла в конце курсовой.Тема:нахождение точек пересечения отрезков.Код прилагаю,если не рудно,проверьте пожалуйста правильность,а то я не уверен:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.IO;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace kyrsach
{
    public partial class Form1 : Form
    {
        public bool bdrav;
        public Form1()
        {
            bdrav =  false;
            InitializeComponent();
        }
        Point[] ms;
        private void button1_Click(object sender, EventArgs e)
 
        {
            int n,i,k,j;
            
            double x1,x2,x3,x4,y1,y2,y3,y4,x,y,l,k1,k2;
           
 
            n = int.Parse(textBox1.Text);
            
 
 
           
            
 
            double[] mx = new double[n*n];
 
            double[] my = new double[n*n];
 
 
            double[] ax = new double[n];
 
 
            double[] ay = new double[n];
 
 
            double[] bx = new double[n];
 
 
            double[] by = new double[n];
            double[] ms = new double[mx.Length + my.Length];
 
            for (int h = 0;h < mx.Length; h++)
            {
                ms[h] = mx[h];
                
            }
            for (int h = 0;h < my.Length; h++)
            {
                ms[h + mx.Length] = my[h];
            }
            ms = new double[n];
 
            StreamWriter sw;
            FileInfo fi = new FileInfo("C:/output.txt");
            sw = fi.AppendText();
 
            string tmp = "";
 
            Random rand = new Random();
            int size = 10;
            for (i = 0; i < n; i++)
            {
                
 
                ax[i] = rand.Next(size);
 
 
                ay[i] = rand.Next(size);
 
                bx[i] = rand.Next(size);
 
                by[i] = rand.Next(size);
 
                tmp = "Отрезок № " + i + ":(" + ax[i] + "," + ay[i] + "," + bx[i] + "," + by[i] + "," + ")";
                /*sw = fi.AppendText();
                sw.Write("Отрезок № ");
                sw.Write(System.Convert.ToString(i));
                sw.Write(":(");
                sw.Write(System.Convert.ToString(ax[i]));
                sw.Write(",");
                sw.Write(System.Convert.ToString(ay[i]));
                sw.Write("),(");
                sw.Write(System.Convert.ToString(bx[i]));
                sw.Write(",");
                sw.Write(System.Convert.ToString(ay[i]));
                sw.WriteLine(")");*/
                
                sw.WriteLine(tmp);
 
                tmp = "";
            }
            sw.Close();
 
            k = 0;
            for (i = 0; i <= n - 1; i++)
            {
                for (j = i + 1; j < n; j++)
                {
                    x1 = ax[i]; y1 = ay[i];
                    x2 = bx[i]; y2 = by[i];
                    if (x1 > x2)
                    { l = x1; x1 = x2; x2 = l; }
                    if (y1 > y2)
                    { l = y1; y1 = y2; y2 = l; }
                    x3 = ax[j]; y3 = ay[j];
                    x4 = bx[j]; y4 = by[j];
                    if (x3 > x4)
                    { l = x3; x3 = x4; x4 = l; }
                    if (y3 > y4)
                    { l = y3; y3 = y4; y4 = l; }
                    k1 = (x2 - x1) / (y2 - y1);
                    k2 = (x4 - x3) / (y4 - y3);
                    
                    if (k1 != k2)
                    {
                        x = Math.Abs(((x1*y2-x2*y1)*(x4-x3)-(x3*y4-x4*y3)*(x2-x1))/((y1-y2)*(x4-x3)-(y3-y4)*(x2-x1)));
                        y = Math.Abs(((y3-y4)*x-(x3*y4-x4*y3))/(x4-x3));
 
                        if (((x1 <= x) && (x2 >= x) && (x3 <= x) && (x4 >= x)) || ((y1 <= y) && (y2 >= y) && (y3 <= y) && (y4 >= y)))
                        {
                            k = k + 1;
                            mx[k] = x;
                            my[k] = y;
                            StreamWriter se;
                            FileInfo fe = new FileInfo("C:/output.txt");
                            se = fe.AppendText();
                            se.Write("отрезки ");
                            se.Write(System.Convert.ToString(i));
                            se.Write(" и ");
                            se.Write(System.Convert.ToString(j));
                            se.Write(" пересекаются в точке ( ");
                            se.Write(System.Convert.ToString(x));
                            se.Write(" , ");
                            se.Write(System.Convert.ToString(y));
                            se.WriteLine(" )");
                            se.Close();
 
                        }
 
                    }
 
 
 
 
                }
            }
            StreamWriter sq;
            FileInfo fq = new FileInfo("C:/output.txt");
            sq = fq.AppendText();
            sq.Write("Количество пересечений ");
            sq.WriteLine(System.Convert.ToString(k));
            sq.Close();
          
           
            label2.Text = "Выполнено";
        }
если с кодом недочетов нет,то у меня возникает следующий вопрос.Как создать график,на котором будут мои отрезки и их пересечения?
вопрос очень срочный,помогите ,люди добрые)надеюсь на вашу скорость)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.04.2013, 13:39
Ответы с готовыми решениями:

Проверка пересечения отрезков
Народ помогите нужно написать в visual studio приложение windows form. Даны координаты концов двух отрезков нужно определить пересекаются...

Наличие пересечения отрезков на графике
Есть форма с отрисовкой на ней графика полигона. Необходимо определить, было ли нажатие мыши внутри полигона или снаружи. Знаю, что надо...

Нахождение точек пересечения окружности и отрезка прямой
Необходимо найти координаты точек пересечения окружности и отрезка прямой выходящего из центра этой окружности. изначально задание вот...

10
Футболист
 Аватар для Goal
533 / 435 / 142
Регистрация: 31.10.2011
Сообщений: 1,010
12.04.2013, 03:19
Программу писать не буду изза принципов, но немного помогу.
Все очень просто!
х1, у1 и х2,у2 - координаты вершин первого отрезка;
х3, у3 и х4,у4 - координаты вершин второго отрезка;

для нахождения пересечения составляем уравнения прямых:
первое уравнение:
(x-x1)/(x2-x1)=(y-y1)/(y2-y1);
второе уравнение
(x-x3)/(x4-x3)=(y-y3)/(y4-y3);
эти уравнения определяют прямую проходящую через две точки, то, что нам и надо.
Из этих уравнений находим х и у по следующим формулам:
x:=((x1*y2-x2*y1)*(x4-x3)-(x3*y4-x4*y3)*(x2-x1))/((y1-y2)*(x4-x3)-(y3-y4)*(x2-x1));
y:=((y3-y4)*x-(x3*y4-x4*y3))/(x4-x3);
так как наши прямые пересекаются, то у них есть общая точка пересечения с координатами (х,у), которую нам и надо найти.
для того, чтоб пересечение принадлежало нашим отрезкам, нужно его ограничить, т. е проверить условие:
если
(((x1<=x)and(x2>=x)and(x3<=x)and(x4>=x)) or((y1<=y)and(y2>=y)and(y3<=y)and(y4>=y) ))
то существует точка пересечения данных отрезков, а нет – то нет и точки пересечения.
Еще следует проверить параллельность этих отрезков при помощи угловых коэффициентов:
k1:=(x2-x1)/(y2-y1);
k2:=(x4-x3)/(y4-y3);
где k1 и k2 – тангенсы угла наклона отрезков к положительному направлению оси ОХ, если k1=k2, то отрезки параллельны, а значит, не имеют точек пересечения.
0
0 / 0 / 0
Регистрация: 10.04.2013
Сообщений: 7
13.04.2013, 17:34  [ТС]
спасибо конечно,но посмотрите код моей программы. и вы можете увидеть,что там написанно именно то,что вы написали.именно это и не работает(
0
 Аватар для Квент
16 / 16 / 1
Регистрация: 11.06.2011
Сообщений: 35
14.04.2013, 10:33
Jaffa_UA,
На правах "не читал, но осуждаю"
1) модули (Math.abs) лишние
2) в условии между x и y должно быть "И" а не "ИЛИ" (||)
З.Ы.
В таких задач незаменим контрольный пример на листочке с расчетами рядом, и просто сравнивать каждый этап с ручным результатом, легко искать ошибку.
0
0 / 0 / 0
Регистрация: 10.04.2013
Сообщений: 7
16.04.2013, 10:37  [ТС]
Спасибо)в услвии между х и у ставил &, и убирал модули,но тогда в файл,некоторые координаты записыватся отрицательно,к примеру (-67.6483; 43.9283)вот такие пироги,а почему отрицательные,яя не мгу понять
0
7 / 29 / 7
Регистрация: 04.04.2013
Сообщений: 282
16.04.2013, 14:02
по теме - ну пересчитай, как тебе сказали - листок в руки и вперед с песней

Кодинг проверять лень так как точно так же придется брать листик и выщитывать что не так...

Не по теме:

Не понимаю таких заданий, тем более для курсовой... Чистая математика, программирования практически ноль, расчет того что в жизни в принципе если и понадобится то ох как не скоро да и то в чем то неординарном проэкте

0
0 / 0 / 0
Регистрация: 10.04.2013
Сообщений: 7
16.04.2013, 15:51  [ТС]
хорошо_спасибо за совет)если что -отпишусь)
0
 Аватар для Квент
16 / 16 / 1
Регистрация: 11.06.2011
Сообщений: 35
16.04.2013, 21:26
BeBrave,

Не по теме:


я тут недавно положение руки на изображении распознавал, так там этой "чистой математики" пол программы, так что в жизни это очень пригодится



Добавлено через 11 минут
Jaffa_UA,
По поводу отрицательных - косяк, видимо, в том, что ищешь пересечение прямых, а не отрезков, а прямые могут за твоей плоскостью пересекаться это да, и отрицательные, и положительные, и бесконечности (параллельные) всякие
0
0 / 0 / 0
Регистрация: 10.04.2013
Сообщений: 7
17.04.2013, 16:59  [ТС]
тоесть,мне нужно добавить условия,дабы прямые выходящие за предел плоскости не россматирвались вообще*?
0
 Аватар для Квент
16 / 16 / 1
Регистрация: 11.06.2011
Сообщений: 35
17.04.2013, 17:34
Jaffa_UA,
Цитата Сообщение от Goal Посмотреть сообщение
Программу писать не буду изза принципов,
то есть вам нужно пересмотреть алгоритм, как уже несколько раз говорилось, с листочком и примером;
то есть если у вас получается отрицательная точка, то вы либо неправильное ее считаете, либо неверно определяете принадлежность точки пересечения отрезкам;
то есть вам уже дали алгоритм, если не верите найдите другой, вам нужно его всего лишь закодировать;
то есть если вы не хотите с этим разбираться (уж можете это точно), то добро пожаловать в ветку фриланса, там вам все разжуют и покажут с картинками.
На этом капитан очевидность откланивается.
Ах да, условие добавлять не нужно.
0
0 / 0 / 0
Регистрация: 10.04.2013
Сообщений: 7
19.04.2013, 01:56  [ТС]
троллинг это хорошо,но выбирайте пожалуйста подабающую публику,в ином случае ваше мнение мне не интересно.то есть спасибо за советы
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.04.2013, 01:56
Помогаю со студенческими работами здесь

Нужна формула координат точек пересечения отрезков
Напишите пожалуйста формулу нахождения координат точек пересечения отрезков с заданными координатами их концов

Напечатать координаты всех точек пересечения отрезков
Даны четыре отрезка a, b, c, d, заданные координатами их концов. Напечатать координаты всех точек пересечения этих отрезков. Вычисление...

Нахождение точки пересечения отрезков в трехмерном пространстве
Как найти точку пересечения отрезков(и если пересекаются) в трехмерном пространстве, если известны координаты начала и конца отрезков?...

Сколько точек пересечения отрезков находится внутри окружности?
• На окружности отмечены 10 точек. Каждая пара точек соединена отрезком. Сколько точек пересе- чения отрезков находится внутри окружности?

Нахождение точки пересечения двух отрезков заданных координатами
Есть ли у кого решение на нахождение точки пересечения двух отрезков заданных координатами A(x1,y1,z1) и B(x2,y2,z2)? Спасибо.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Киев стоит - украинская песня
zorxor 28.01.2026
wfWdiRqdTxc О Господи, Вечный, Ты . . . Я помоги, Бесконечный. . . Я прошу Ты. . . Я погибаю, спаси. . . Я прошу Тебя Вечный. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru