Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Как узнать в каких координатах прямая и кривая пересекают друг друга (c#)

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Как узнать в каких координатах прямая и кривая пересекают друг друга (c#)
Имя
Сообщение << Старые топики   Новые топики >>
Как узнать в каких координатах прямая и кривая пересекают друг друга (c#) - 2009-04-25 22:10:48.026666   
Albertozzy

Сообщений: 55
Оценки: 0
Присоединился: 2006-10-20 12:00:58.660000
Программа состоит из 3-х форм //главная-1я . 1-я выводит график, 2-я и 3-я выводят графики(кривые) пересечения кривых с определенной прямой(на 1м графике…//прямая-черным, кривые-синим). Проблема заключается в том, чтобы определить координаты пересечения прямой(1-й из 2х) с кривыми(я ими чтото типа кругов нарисовал).
вот код :
1-я форма:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace WindowsApplication1 { public partial class Form1 : Form { Pen pencurrent1 = new Pen(Color.Black); Pen pencurrent2 = new Pen(Color.Blue); public Form1() { InitializeComponent(); } private void pictureBox1_Click(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { Graphics graf = this.pictureBox1.CreateGraphics(); //Point[] p = new Point[]; // int x1 = 60; //int x2 = 60; graf.DrawLine(pencurrent1,60, 0, 60, 300); graf.DrawLine(pencurrent1, 120, 0, 120, 300); graf.DrawLine(pencurrent1, 180, 0, 180, 300); graf.DrawLine(pencurrent1, 240, 0, 240, 300); graf.DrawLine(pencurrent1, 300, 0, 300, 300); graf.DrawLine(pencurrent1, 0, 60, 300, 60); graf.DrawLine(pencurrent1, 0, 120, 300, 120); graf.DrawLine(pencurrent1, 0, 180, 300, 180); graf.DrawLine(pencurrent1, 0, 240, 300, 240); graf.DrawLine(pencurrent1, 0, 300, 300, 300); int[] XK1 = new int[] { 120, 180, 200, 200, 180, 120, 100, 100, 120 }; int[] YK1 = new int[] { 100, 100, 120, 180, 200, 200, 180, 120, 100 }; Point[] curvePoints1 = new Point[9]; for (int i = 0; i &lt;= 8; i++) { curvePoints1[i].X = XK1[i]; curvePoints1[i].Y = YK1[i]; } int[] XK2 = new int[] { 120, 180, 220, 220, 180, 120, 80, 80, 120 }; int[] YK2 = new int[] { 80, 80, 120, 180, 220, 220, 180, 120, 80 }; Point[] curvePoints2 = new Point[9]; for (int i = 0; i &lt;= 8; i++) { curvePoints2[i].X = XK2[i]; curvePoints2[i].Y = YK2[i]; } int[] XK3 = new int[] { 120, 180, 240, 270, 270, 240, 180, 120, 60, 30, 30, 60, 120 }; int[] YK3 = new int[] { 30, 30, 60, 120, 180, 240, 270, 270, 240, 180, 120, 60, 30 }; Point[] curvePoints3 = new Point[13]; for (int i = 0; i &lt;= 12; i++) { curvePoints3[i].X = XK3[i]; curvePoints3[i].Y = YK3[i]; } // Point pt1= new Point; //Point pt2= new Point; graf.DrawCurve(pencurrent2, curvePoints1); graf.DrawCurve(pencurrent2, curvePoints2); graf.DrawCurve(pencurrent2, curvePoints3); graf.DrawLine(pencurrent1, 0, 300 , 240, 0 ); graf.DrawLine(pencurrent1, 0, 300, 300, 60); //120, 100 //180, 100 //200, 120 //200, 180 //180, 200 //120, 200 //100, 180 //100, 120 //120, 100 //120, 80 //180, 80 //180, 120 //180, 180 //180, 200 //120, 200 //100, 180 //100, 120 //120, 100 //тут некоторые координаты неправильные в комментах-убрать не успел ещё //graf.DrawCurve(pencurrent2, , ); } private void button2_Click(object sender, EventArgs e) { Form2 MyForm2 = new Form2(this); MyForm2.Show(); } private void button3_Click_1(object sender, EventArgs e) { Form3 MyForm3 = new Form3(this); MyForm3.Show(); } } }
2-я форма:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace WindowsApplication1 { public partial class Form2 : Form { Pen pencurve1 = new Pen(Color.Azure); private Form1 parentForm1; public Form2() { InitializeComponent(); } public Form2(Form1 myForm1) : this() { parentForm1 = myForm1; } private void button2_Click_1(object sender, EventArgs e) { this.Close(); } private void button1_Click(object sender, EventArgs e) { Graphics graf = this.pictureBox1.CreateGraphics(); int[] XK1 = new int[] { 0, 1, 2, 3, 4, 5 }; int[] YK1 = new int[] {0 , 1, 2, 3, 4, 5 } ; Point[] curvePoints1 = new Point[6]; for (int i = 0; i &lt;= 5; i++) { curvePoints1[i].X = XK1[i]; curvePoints1[i].Y = YK1[i]; } graf.DrawCurve(pencurve1 , curvePoints1 ); } } } 3-я:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace WindowsApplication1 { public partial class Form3 : Form { Pen pencurve1 = new Pen(Color.Azure); private Form1 parentForm1; public Form3() { InitializeComponent(); } public Form3(Form1 myForm1) : this() { parentForm1 = myForm1; } private void button2_Click(object sender, EventArgs e) { this.Close(); } private void button1_Click(object sender, EventArgs e) { Graphics graf = this.pictureBox1.CreateGraphics(); int[] XK1 = new int[] { 0, 1, 2, 3, 4, 5 }; int[] YK1 = new int[] { 0, 1, 2, 3, 4, 5 }; Point[] curvePoints1 = new Point[6]; for (int i = 0; i &lt;= 5; i++) { curvePoints1[i].X = XK1[i]; curvePoints1[i].Y = YK1[i]; } graf.DrawCurve(pencurve1, curvePoints1); } } }
Post #: 1
RE: Как узнать в каких координатах прямая и кривая пересекают друг друга (c#) - 2009-04-25 23:36:40.620000   
Genco

Сообщений: 1662
Оценки: 90
Присоединился: 2007-12-16 23:11:22.003333
Ну…я так понял,что кривые=массивы точек,не уравнениями? В принципе можно смотреть попарно и последовательно соседние точки кривых(по 2 от каждой). Это такие 2 отрезочка каждый раз берутся значит. Если они пересекаются,то и сами кривые тоже пересекаются,причем в тех же точках. Пересечение 2х прямых (на которых отрезки и лежат) проверятся математикой.Вот,примерно.
Post #: 2
RE: Как узнать в каких координатах прямая и кривая пересекают друг друга (c#) - 2009-04-26 05:18:16.913333   
Denaturat

Сообщений: 1741
Оценки: 453
Присоединился: 2008-10-27 20:50:06.380000
пересечение графиков двух функций означает что значения этих функций в данной точке равны (для дискретного множества - с определённой, наперёд заданной погрешностью). для функций, заданных последовательностью значений, применяется подходящий алгоритм интерполяции
Post #: 3
RE: Как узнать в каких координатах прямая и кривая пересекают друг друга (c#) - 2009-04-30 23:41:11.556666   
Albertozzy

Сообщений: 55
Оценки: 0
Присоединился: 2006-10-20 12:00:58.660000
quote:

Ну…я так понял,что кривые=массивы точек,не уравнениями? В принципе можно смотреть попарно и последовательно соседние точки кривых(по 2 от каждой). Это такие 2 отрезочка каждый раз берутся значит. Если они пересекаются,то и сами кривые тоже пересекаются,причем в тех же точках. Пересечение 2х прямых (на которых отрезки и лежат) проверятся математикой.Вот,примерно.

Так вроде понятно, но как определить каждое значение координаты точки кривой(то есть имею ввиду-напр-р я знаю только 5 точек по которым я кривую и построил, как мне остальные все узнать?)?…если я правильно понял нам каждую точку(или 2 ее соседние) проверять придеться?


quote:

(для дискретного множества - с определённой, наперёд заданной погрешностью). для функций, заданных последовательностью значений, применяется подходящий алгоритм интерполяции
а вот тут совсем незнакомые слова
Post #: 4
RE: Как узнать в каких координатах прямая и кривая пересекают друг друга (c#) - 2009-05-01 00:46:21.556666   
Denaturat

Сообщений: 1741
Оценки: 453
Присоединился: 2008-10-27 20:50:06.380000
http://khpi-iip.mipk.kharkiv.edu/library/datastr/book_sod/structura/chapter8.htm
http://ru.wikipedia.org/wiki/Интерполяция

по заданным множествам точек и значений функции на этих точках аппроксимируется кривая, которую ты уже можешь исследовать как тебе угодно на всём отрезке. простейшие алгоритмы интерполяции - полиномиальные (например, формула Ньютона):

http://ru.wikipedia.org/wiki/Интерполяционная_формула_Ньютона

твоя задача сводится к следующей: для всех последовательностей значений строятся соответствующие им полиномы, находится их разность, и находится ноль для этой разности (точка, на которой разность полиномов будет иметь значение, меньшее некоторого наперёд заданного эпсилон)
Post #: 5
RE: Как узнать в каких координатах прямая и кривая пересекают друг друга (c#) - 2009-05-04 19:07:04.030000   
TimeBandit

Сообщений: 63
Оценки: 0
Присоединился: 2008-08-24 01:58:50.050000
Denaturat, смотрю ты в численном анализе шариш :) помоги с лабами.
Post #: 6
RE: Как узнать в каких координатах прямая и кривая пересекают друг друга (c#) - 2009-05-04 20:53:47.420000   
Genco

Сообщений: 1662
Оценки: 90
Присоединился: 2007-12-16 23:11:22.003333
Слуш,не имей себе моск и для начала интерполируй прямыми(т.е. так как я написал). Метод ты потом улучшишь если что. Дискретное множество = множество точек, задано НЕ непрерывно.Алгоритм интерполяции = "чем считать кривую между 2мя заданными точками". Прроверяешь каждые из 5 так напр.: 1ю и 2ю, 2ю и 3ю, 3ю и 4ю….и так для обеих кривых(при малости таких отрезочков можно считать пересечение прямых,задаваемых каждой из пар точек). То что предложил Denaturat это способ где приближаем кривую многочленом, это ты всегда успеешь так переделать.
Post #: 7
RE: Как узнать в каких координатах прямая и кривая пересекают друг друга (c#) - 2009-05-05 21:59:16.746666   
Albertozzy

Сообщений: 55
Оценки: 0
Присоединился: 2006-10-20 12:00:58.660000
quote:

Слуш,не имей себе моск и для начала интерполируй прямыми(т.е. так как я написал). Метод ты потом улучшишь если что. Дискретное множество = множество точек, задано НЕ непрерывно.Алгоритм интерполяции = "чем считать кривую между 2мя заданными точками". Прроверяешь каждые из 5 так напр.: 1ю и 2ю, 2ю и 3ю, 3ю и 4ю….и так для обеих кривых(при малости таких отрезочков можно считать пересечение прямых,задаваемых каждой из пар точек)

Я так понял, что ты предлагаешь рассматривать "круги" как n-угольники, где n-кол-во точек по которым я построил "круг"(кривую) ? При этом предположим что кривая полностью состоит из 8 точек(так и есть вроде) , я так понял, что ты предлагаешь разбить её на 8 отрезков(по каждому можно построить прямую y=kx+b) и уже с каждым отрезком просматривать пересекается данная(на графике) прямая или нет(по которой так же несложно составить ф-ю y=mx+c) ?

Если я тебе понял и вышеуказанное верно(что может быть и не так конечно же) то по поводу улучшить метод -можно наверное разбить круги на 4 кривые(состоящие из 3х точек) и каждую из них аппроксимировать и по полученную через аппроксимацию функцию (принцип-сумма наименьших квадратов или че-то типа того) приравнять к функции данной на графике прямой….что об этом можно сказать?

Ещё кстати есть один вариант несложный-но не очень точный( с отрезками кстати если я понял верно-тоже не высокой точности)-тупо рассмотреть кривые как круги, найти радиус(что не сложно сделать) и построить уравнения функций вида x^2 + y^2 = r, где r-радиус и составить систему уравнений с построенным уравнением данной на графике прямой …вроде норм должно быть.

Если все что я написал верно, то прошу обьяснить ещё пару моментов- по поводу аппроксимации и интерполяции(что предложил denaturat). дело в том, что я с аппроксимацией плохо знаком-делал лишь один раз и не оч хорошо помню. В прошлый раз я аппроксимировал примерно так:
был набор переменная x, значение ф-и y(ломаная). Предполагалось построить ф-ю вида y=a+bx , взялипроизводную по разности ф-й в квадрате (по (y- Y)^2 =(y-a-bx)^2)
-сначала по a, потом по b, получили систему ( y(i)-a-bx(i)=0 )&( yx(i)-ax(i)-b(x(i))^2=0 ), потом ч-то-то сделали(посчитали суммы иксов игриков итд вроде ) и получили систему вида
(sum(y(i))=na+bsumx(i)) & (sum(x(i) y(i))=asumx(i)+bsum(x^2)) где- sum- суммирование по i(всех знач-й вроде). потом проводили кое-какие операции с определителями-нашли det, detb, нашли deta (если надо-тут могу поподробнее описать, но думаю это не столь важно) и нашли a=deta/det, b=detb/d etи получили функцию Y=ax+b .

Имелось ли ввиду(способ от Denaturata) делать через такой метод, или же он тут не подходить? И если я правильно понял кое-что вышеописанное0могу ли я там использовать такой метод аппроксимации? говорю такой, т.к. в прошлый раз у меня была ломаная и построилась чуть-ли не прямая кривая(довольнотаки точно), а тут все-таки "окружности" целые и быть может имеються чуть отличающиеся но основанные на том же принципе аппроксимационные методы-имею ввиду, те что строят ф-ю не вида ax+b(как-то странно ведб с окружностями такое использовать)), а строят что-то типа y^2+x^2=r или ещё более подходящую?

И ещё по поводу интерполяции- так и не догнал этот метод: так вроде сначала строятся полиномы по Короткой форме интерполяционной формулы Ньютона(она сразу ко всему набору пар x y применяеться же вроде?) потом находятся разности между полиномами различных наборов пар x,y . потом что вот постчет точки меньше како-гото эпсилона(зачем оно тут вообще?)… обычно я так понимаю …это очень маленькое число…-примерно) я не очень понял и что с этим нулем делать дальше?…Если можно не мог бы ты обьяснить на каком-либо примере с небольшим количеством точек?…….и я ещё…после того как тут интерполяцию проведем-что мы должны получить(хотелось бы функцию какую если честно))?

…п.с. сорри если загрузил кого)….задача интрес вызвала просто)
Post #: 8
RE: Как узнать в каких координатах прямая и кривая пересекают друг друга (c#) - 2009-05-05 23:46:01.150000   
Genco

Сообщений: 1662
Оценки: 90
Присоединился: 2007-12-16 23:11:22.003333
Да,точность моего метода достигается когда точек немало.Если у тебя круги и не оговорено отдельно считать их набором точек,то юзать их уравнение будет куда удобнее(напомню,у уравнения ты знаешь значение в любой точке). Своим методом тож попробуй,раз работал,почему нет,я просто не особо разбирался в хитрости твоей аппроксимации,но вроде что то разумное. Эпсилон нужен для сравнения чисел с плавающей точкой (как ты понимаешь,совпадение с машинной точностью маловероятно,поэтому совпадение в выбранной окрестности используем). Опять же реши что ты хочешь получить - если значения в промежуточных точках(ну для пересечений например), или функцию (аппроксимирующую,это уже другое немного). МНК всякие как раз подбирают функции. Кароч,попробуй по-разному и посмотри как точнее/удобнее выходит. Сори,код смастерить пока времени нету.
Post #: 9
RE: Как узнать в каких координатах прямая и кривая пересекают друг друга (c#) - 2009-05-06 22:32:05.600000   
Albertozzy

Сообщений: 55
Оценки: 0
Присоединился: 2006-10-20 12:00:58.660000
quote:

Сори,код смастерить пока времени нету.
да нене итакгудфэнкс фо ю мэн вы ребят реально помогли…я так хоть новые методы какие-то открыл для себя)…так с числ. анализом сталкиваюсь едва ли не впервые…и думаю терь-куда более интересней и понетнее, когда он применяется где-то на практике…так вот думаю даже задумываться бы не стал над всякими там ньютоновскими формулами)…забил бы просто скорей всего)
quote:

Если у тебя круги и не оговорено отдельно считать их набором точек,то юзать их уравнение будет куда удобнее(напомню,у уравнения ты знаешь значение в любой точке)
если совсем круги то да, но тут как раз набор точек, по которомы я через drawcurve() построил кривую(всего 3 )(и они лишь только приближенно имеют форму окружностей, но таковыми не являются) , но если б точная окружность была, то ,полностяю соглашусь, метод решения системы уравнений окружностей и уравнений прямых гораздо удобнее. Тут кстати чем сложнее метод тем лучше может даже-напомню, что для себя делаю и хочу хоть более менее ознакомиться с различными типами решений(так -на будущее-где-то может один подойти, другой нет, где-то наоборот итд), которые тут можно исп-ть(хотя посути и одного ,навроде интерполяций или аппрокс-й, каких-либо уже достаточно)
quote:

Своим методом тож попробуй,раз работал,почему нет
да да -полюбому надо.

Ещё кстати тут методом Лагранжа можно наверно интерполировать?)…или нет?
Post #: 10
RE: Как узнать в каких координатах прямая и кривая пересекают друг друга (c#) - 2009-05-06 22:40:49.926666   
Albertozzy

Сообщений: 55
Оценки: 0
Присоединился: 2006-10-20 12:00:58.660000
кстати -по поводу алгоритма Ньютона догнал вроде более менее- Denaturatнорм обьяснил:
quote:

твоя задача сводится к следующей: для всех последовательностей значений строятся соответствующие им полиномы, находится их разность, и находится ноль для этой разности (точка, на которой разность полиномов будет иметь значение, меньшее некоторого наперёд заданного эпсилон)

я посчет эпсилона загонялся-теперь вроде понятно-идея совсем проста, боюсь загвоздка только в построении и вычислении полиномов может быть(типа вычисления большие могут быть, но не уверен).
И ещё плиз: я думаю- разность между полиномом построенным по кривой и полин-м построенным по прямой вполне можно вычислять, для нахождения нуля?( ну вправду, а почему бы и нет))
Post #: 11
RE: Как узнать в каких координатах прямая и кривая пересекают друг друга (c#) - 2009-05-07 15:27:27.096666   
Denaturat

Сообщений: 1741
Оценки: 453
Присоединился: 2008-10-27 20:50:06.380000
quote:

ORIGINAL: Albertozzy

Если все что я написал верно, то прошу обьяснить ещё пару моментов- по поводу аппроксимации и интерполяции(что предложил denaturat). дело в том, что я с аппроксимацией плохо знаком-делал лишь один раз и не оч хорошо помню. В прошлый раз я аппроксимировал примерно так:
был набор переменная x, значение ф-и y(ломаная). Предполагалось построить ф-ю вида y=a+bx , взялипроизводную по разности ф-й в квадрате (по (y- Y)^2 =(y-a-bx)^2)
-сначала по a, потом по b, получили систему ( y(i)-a-bx(i)=0 )&( yx(i)-ax(i)-b(x(i))^2=0 ), потом ч-то-то сделали(посчитали суммы иксов игриков итд вроде ) и получили систему вида
(sum(y(i))=na+bsumx(i)) & (sum(x(i) y(i))=asumx(i)+bsum(x^2)) где- sum- суммирование по i(всех знач-й вроде). потом проводили кое-какие операции с определителями-нашли det, detb, нашли deta (если надо-тут могу поподробнее описать, но думаю это не столь важно) и нашли a=deta/det, b=detb/d etи получили функцию Y=ax+b .


если я правильно понял ход твоих мыслей, то это регрессия. метод хороший, годный, но годится в основном для статистических исследований - так как значения полученной функции в заданных точках могут не совпадать с данными. график полученной функции будет в данном случае будет прямой

http://ru.wikipedia.org/wiki/Метод_наименьших_квадратов
http://ru.wikipedia.org/wiki/Регрессионный_анализ

в этом направлении можно почитать прикладную статистику, начиная где-то отсюда:

http://ru.wikipedia.org/wiki/Проверка_статистических_гипотез

quote:

ORIGINAL: Albertozzy

Имелось ли ввиду(способ от Denaturata) делать через такой метод


нет, хотя почитать о нём стоит

quote:

ORIGINAL: Albertozzy

может имеються чуть отличающиеся но основанные на том же принципе аппроксимационные методы-имею ввиду, те что строят ф-ю не вида ax+b(как-то странно ведб с окружностями такое использовать)), а строят что-то типа y^2+x^2=r или ещё более подходящую?


имеются. по ссылке на определение интерполяции выше несколько штук есть
Post #: 12
RE: Как узнать в каких координатах прямая и кривая пересекают друг друга (c#) - 2009-05-07 15:37:28.170000   
Denaturat

Сообщений: 1741
Оценки: 453
Присоединился: 2008-10-27 20:50:06.380000
quote:

ORIGINAL: Albertozzy

Ещё кстати тут методом Лагранжа можно наверно интерполировать?)…или нет?


можно. полиномиальные алгоритмы интерполяции дают хороший результат для большинства хороших (непрерывных, гладких) функций. исключения есть - вроде функции Рунге - но они достаточно редки

http://en.wikipedia.org/wiki/Runge's_phenomenon

quote:

ORIGINAL: Albertozzy

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


http://www.codecogs.com/d-ox/maths/interpolation/lagrange.php

преждевременная оптимизация - корень зла. сначала напиши работающую версию, а потом уже смотри как её можно улучшить

quote:

ORIGINAL: Albertozzy

И ещё плиз: я думаю- разность между полиномом построенным по кривой и полин-м построенным по прямой вполне можно вычислять, для нахождения нуля?( ну вправду, а почему бы и нет))


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

(a * x^2 + b * x + c) - (d * x + e) = a * x^2 + (b - d) * x + (c - e)
Post #: 13
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Как узнать в каких координатах прямая и кривая пересекают друг друга (c#)







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.