Построение прямой по точкам C# #441055


#0 by micha
Прошу помощи в решении следующей задачи, Из нижнего центра экрана (формы) мне нужно нарисовать линию (прямую по точкам), причем условия следующие. Экран допустим 300x300 Начало рисования линии равно A(150,300) По экрану (форме) щелкая мышью вызываю событие Form1_MouseDown, которое передает процедуре risovanie(double x2, double y2) напровление (вектор) прямой которую мне нужно нарисовать. Т.Е Form1_MouseDown предает вектор напровления прямой которая будет рисоваться например пока не кончиться форма. private void Form1_MouseDown(object sender, MouseEventArgs e) {   sovanie(e.X, e.Y); } private void risovanie(double x2, double y2) { } Сложность задачи в том что известные мне методы построения базируються на постороение прямой по функции извесным двум точкам, начальной и конечной. У меня же проблема в том что конечная точка не известна в момент посторения прямой. Щелкая по экрану мы лишь задаем напровление построения обьекта. А в момент построения обьекта будет постоянно проверяться условие на границы формы и на наличие другого обьекта в области построения прямой.
#0 by micha
Прошу помощи в решении следующей задачи, Из нижнего центра экрана (формы) мне нужно нарисовать линию (прямую по точкам), причем условия следующие. Экран допустим 300x300 Начало рисования линии равно A(150,300) По экрану (форме) щелкая мышью вызываю событие Form1_MouseDown, которое передает процедуре risovanie(double x2, double y2) напровление (вектор) прямой которую мне нужно нарисовать. Т.Е Form1_MouseDown предает вектор напровления прямой которая будет рисоваться например пока не кончиться форма. private void Form1_MouseDown(object sender, MouseEventArgs e) {   sovanie(e.X, e.Y); } private void risovanie(double x2, double y2) { } Сложность задачи в том что известные мне методы построения базируються на постороение прямой по функции извесным двум точкам, начальной и конечной. У меня же проблема в том что конечная точка не известна в момент посторения прямой. Щелкая по экрану мы лишь задаем напровление построения обьекта. А в момент построения обьекта будет постоянно проверяться условие на границы формы и на наличие другого обьекта в области построения прямой.
#1 by H A D G E H O G s
Я тебя не понял.
#2 by micha
Что именно не понятно? Нужно нарисовать прямую, по точкам. Графики по точкам задаються функцией, задаеться шаг определенный, затем все это выводиться на экран. Проблема в том что я немного затупил, создовая функцию. Прошу помощи.
#3 by micha
По сути в задаче известна начальная точка, и вектор напровления. Я не нашел в google описания данного алгоритма. Так же поискал задачи свои, когдая учил в универе. На Pascal я в свое время строил такие вещи по 2-м точкам. Сдесь 2-й точки нет, Есть вектор.
#4 by H A D G E H O G s
как дикость: 1) Перейти в полярные координаты 2) Увеличить величину p до бесконечности 3) Перейти в Декартовы обратно...
#5 by H A D G E H O G s
#6 by ShoGUN
Нафига? :) Вектор-то как задан?
#7 by micha
я ссылок могу куча надовать, я прошу конкретного решения конкретной проблемы
#8 by H A D G E H O G s
Правда, я не знаю, как себя ведет Холст (Canvas) в С шарпе, в Дельфи бесконечно большие координаты покатят
#9 by Дарлок
#10 by H A D G E H O G s
У него есть отрезок, по 2-м точкам, его надо продолжить до конца окна (холста), сделать "луч"
#11 by ShoGUN
Не судьба уравнение прямой заюзать? :) Потом просто найти точку, где прямая пересекается с границей канвы(таких по идее 2, нужно выбрать одну из них) и использовать эту точку для построения.
#12 by ShoGUN
границей холста, чтоб вас всех ))
#13 by H A D G E H O G s
Полярные координаты круче!
#14 by ShoGUN
Черт, и не поспоришь толком!)
#15 by micha
Есть еще мысли по решению данной проблемы?
#16 by Rie
А в чём проблема-то? Учебник геометрии - там есть уравнение прямой. Учебник алгебры - расскажет о методах решения систем линейных уравнений с двумя неизвестными.
#17 by ShoGUN
Тебе уже две правильных мысли привели. Если ты не знаешь азы аналитической геометрии из школьной программы - чего ты от нас-то хочешь?
#18 by dk
Что ты под вектором-то понимаешь? и откуда его берешь?
#19 by fellow
Координаты всех точек, через которые пройдёт линия, можно получить по алгоритму Брезенхема, после чего проверить эти точки на принадлежность границе окна или границе другого объекта. Получив требуемую точку, можно уже рисовать линию от начальной до конечной.
#20 by Rie
Зачем получать _все_ точки, если можно легко и непринуждённо найти граничные точки из уравнения?
#21 by fellow
Очевидно, что топикстартер не хочет простого решения. Пусть решает тупо, в лоб.
#22 by ShoGUN
Это ОЧЕНЬ тупо :) Прямая задается двумя точками, нафига больше-то?
#23 by fellow
Ну и зачем вы с взяли и всю малину обоср.. испортили :о)
#24 by DrZombi
Походу автор хочет реализовать 3Д продукт :)
#25 by supremum
согласен. задача как раз в том что бы найти эти две точки. а мне больше нравятся параболические координаты :)
#26 by ShoGUN
"Нет уж. Лучше вы к нам!"(с) :)
#27 by micha
Из учебника геометрия - Любой вектор можно задать началом, и любой точкой в пространстве которая лежит на нем
#28 by supremum
если векторно то r=r0+v*t параметрическая форма задания прямой где r - радиус вектор r0 - вектор сдвига v - вектор направления координаты можно будет узнать просто по кооффициентам соответствующих орт. если в декартовых координатах то получаем (x*i,y*j)=(x0*i,y0*j)+(v*i,v*j)*t, где i, j орты
#29 by micha
мне по суте надо построить этот вектор (забегая в перед, этот вектор является траекторией движения тела)
#30 by dk
капец, двоишник Уравнение прямой вывести не можешь из вектора?
#31 by supremum
v=dr/dt => v~(r-r0) - если движение равномерное по прямой
#32 by Rie
Построить вектор по концам отрезка? Вычти из координат второй точки координаты начала - вот тебе и координаты вектора. По вектору получаешь уравнение прямой (его тебе уже привели в ). А теперь - о, чудо! границы экрана - это тоже прямые. С уравнениями x=const и y=const. Находишь точки пересечения твоей прямой с границами экрана - и вперёд. Или ты хотел чего-то другого?
#33 by ShoGUN
Уравнение прямой по двум точкам берешь из того же учебника: Находишь пересечение с краями холста, для этого решаешь систему. По полученной точке и одной из первоначальных - стоишь свой луч.
#34 by supremum
r=r0+(r1-r0)*t где r1 -координаты клика мыши, t - параметр
#35 by micha
Как и реализовать программно?
#36 by Rie
"Я ху.ею, дорогая редакция..." Расскажи лучше, а как ты попытался реализовать это программно, что у тебя получилось, а что - нет. (Тут готовы помочь, но выполнять за тебя домашние задания - как то настроения нет).
#37 by micha
Я тоже фигею То что мне нужно описано выше, как сделать информацию пока получил только общию Повторяю что известна начальная точка, и точка на векторе. Так же известны координаты границ. Цикл (Условие проверка на наличие обьекта и границ формы) Шаг = Шаг + 1; Сдесь дожна быть некая формула типа Y(x) = (тара -ра) НарисоватьТочку(X,Y); КонецЦикла Вопрос (тара - ра) -?????????????????????
#38 by micha
(x*i,y*j)=(x0*i,y0*j)+(v*i,v*j)*t, где i, j орты В этом виде подставить нельзя
#39 by Filin396
Я бы добавил еще учебник русского языка. А то "напровление", "мне по суте","только общию"...
#40 by Rie
Чтобы преобразовать из этого вида в код - необходимо подключить brain.dll. Какие у тебя есть идеи по программной реализации этого? Хотя бы одна?
#41 by H A D G E H O G s
Убери руки с клавиатуры, включи мозг. Самое примитивное - имхо - перевод "точки вектора" в полярные координаты, величение величины p и перевод новой "точки вектора" в декартовы... З.Ы. Не забудь, что началом координат у тебя будет не точка (0,0), а точка "начала вектора", "Начало рисования линии равно A(150,300)"
#42 by Salimbek
Чей-та я не верю в твои 27 лет, скорее в 86-й год...
#43 by micha
Да и еще, надо не забывать что координаты у компьютера перевернутые точка (0,0) находиться в верхнем левом углу
#44 by Rie
В полярные - не обязательно. Всё прекрасно считается и в декартовых. А строить можно уже упоминавшимся здесь Брезенхемом.
#45 by Rie
Вот это - абсолютно ни на что не влияет.
#46 by Rie
(x*i,y*j)=(x0*i,y0*j)+(v*i,v*j)*t - это то же самое, что x = x0+v*t; y = y0+v*t;
#47 by H A D G E H O G s
Для метода "полярные координаты" - монопенисуально.
#48 by H A D G E H O G s
Просто там - готовые формулы, думать не надо.
#49 by supremum
Блин Поправка x = x0+vx*t; y = y0+vy*t;
#50 by грязный
А в чем проблема?? Координата нижнего правого угда: int cx = ClientSize.Width; int cy = ClientSize.Height; Координата положения мыши:        private void Form1_MouseMove(object sender, MouseEventArgs e)        {                      mX = e.X; center.Y = e.Y;     }
#51 by грязный
Вместо center.Y = e.Y; надо mY = e.Y;
#52 by micha
Я в свое время много таких задач, решал по моделированию физических процессов. Там все было просто задаешь функцию (формулу). Задаешь приращение (допустим OX) и получаешь OY. Рисуешь точку. Чем меньше шаг тем точнее график, тем дольше расчет. Я пытаюсь к этой задаче подойти так же. Мне не понятно что нужно прирощать OX или Вектор. Я думаю что добавлять вектор и рассчитывать координаты OX OY это было бы более правильно x = x0+vx*t; y = y0+vy*t; разве решает мою проблему? x0,y0 - известны vx vy - ? t - ? Какое значение можно взять за приращение ? наверное t ?
#53 by supremum
из => y=y0+[(y1-y0)/(x1-x0)]*(x-x0) x, y - координаты y0, x0 - начала рисования y1 x1 - куда мышка кликнула
#54 by micha
да не подходит, я это писал в самом начале, по условию неизвестнf координата конца прямой
#55 by supremum
из => vx=x1-x0 vy=y1-y0 +граничные условия 0<=y<=ymax 0<=x<=xmax ymax и xmax высота и ширина формы
#56 by micha
извеняюсь не подходит y=y0+[(y1-y0)/(x1-x0)]*(x-x0) x, y - координаты y0, x0 - начала рисования y1 x1 - куда мышка кликнула
#57 by micha
Хорошо, Что тако t, Граничное условие еще раз повторяю не известно (на пути движения обьекта может появиться другой обьект который изменит траекторию)
#58 by Rie
Уравнение прямой известно? А координаты конца прямой - это те точки, удовлетворяющие этому уравнению, у которых x=0 или x=300, или же y=0 или y=300. Подставляешь эти 0 и 300 в уравнение прямой и получаешь координаты конца. Что именно подставлять - можно определить заранее, сравнивая x0 с x1, y0 с y1.
#59 by Rie
t - просто некоторая (математическая) переменная. И не более. Для построения прямой на экране - почитай алгоритм Брезенхема.
#60 by micha
Можно конечно тупо проверять точки из 0 .. 300 лежат ли они на прямой, но это все лишнии расчеты и тормоза программы. я хочу это избежать.
#61 by грязный
а сколько промежуточных точек будет? Может graphics.DrawBezier(Pen,point,point,point,point); подойдет?
#62 by supremum
так в чем задача? найти точки пересечения нескольких прямых?
#63 by micha
Все таки разве нельзя задать некую формулу, по тем начальным условиям которые я дал в самом начале. Затем выводя точку проверять на наличие объекта в данной точке и границы формулы. Отрезков может быть сколь угодно - все зависит от размера шага
#64 by Ненавижу 1С
найди уравнение прямой по 2 точкам найди пересечения ее с прямыми границы, те точки пересечения, которые будут лежать на границе области, и будут концами вашего отрезка
#65 by Rie
Ты внимательно прочитал?
#66 by micha
Вывести объект который будит двигаться по траектории (прямой) Таких объектов в форме будет дофига. Все они хаотично двигаются, сталкиваются, изменяют траекторию движения я это внимательно прочитал, как мне это программно выразить?
#67 by грязный
Первый клик - рисует прямую из угла в место клика. Второй клик - рисует гладкую кривую из угла в место второго клика, при этом кривая проходит через место первого клика. И так далее. Тебе это нужно, или я не догоняю?
#68 by micha
нет. не это. клик это направление в которое выстрелит пушка ядром. что на пути будет ядра то и разлетиться
#69 by supremum
я понял, задача об упругом столкновении :)
#70 by supremum
а масса и форма ядра учитыватся?
#71 by micha
ДА типо того. Я пишу поигрулену. Хочу что бы объекты двигались правильно (с точки зрения физики)
#72 by micha
масса и форма пока не учитываеться
#73 by supremum
тогда смотри механику (точнее кинематику твердого тела) упругое столконовение
#74 by Rie
_Что именно_ тебе нужно выразить программно? Тебе нужно на каждом шаге проверять, не столнулись ли с другим объектом или с краем экрана? Ну так и задавай для каждого объекта текущие координаты x, y, а также вектор направления dx, dy. На каждом шаге x += dx; y += dy; и проверяй, не столкнулись ли с кем. А ещё лучше - первым проходом определи x1, y1 для всех объектов, и проверь, а не пересекаются ли отрезки ((x,y),(x1,y1)) для каких-либо объектов.
#75 by YauheniL
А если так попробовать: делаешь клик мышкой, есть точка в стороне от прямой. Определяешь проекцию этой точки на свою прямую. Есть вторая точка, определяешь длину своего вектора, строишь прямую... кликаешь второй раз: если проекция точки попадает на "пустое место", повторяешь описанное, иначе DoNothing
#76 by micha
Народ, реально уже весь инет перерыл для поиска решения данного примитивного куска. Второй раз кликать не надо. надо сделать с первого раза
#77 by Andry888
ну есть простая формула y=k*y+b, где b=150 (середина экрана), далее k=(x-150)/y, где  x=f(Xmouse) y=f(Ymouse)... подставляешь в простую формулу коэффициент k+ в y подставляешь высоту экрана и находишь x...
#78 by Andry888
ой формула X=k*y+b...
#79 by Rie
Говорю же - ищи brain.dll, без которой эта задача в принципе неразрешима.
#80 by supremum
как вариант смотри
#81 by грязный
на данный момент у тебя чтото реализовано? ядро вылетает вообще?
#82 by Lama12
Мне б твои проблемы... По вектору находишь коэффициенты в уравнении прямой, а потом строишь прямую из любой точки путем смещения координат. Задачка для 8 класса школы.
#83 by Rie
Нет, вот так посмотришь - какой же я был сволочью, когда студентам давал задачу за одну пару броуновское движение изобразить на экране...
#84 by YauheniL
Тогда еще проще: процедура будет с одной итерацией
#85 by micha
Вы крутой спец, с опытом, студентов учили чему то. А на конкретную задачу так и не ответили. Посмотри туда почитай это - это не ответ!
#86 by supremum
самый простой вариант рассмотреть систему точечных частиц. тогда достаточно будет взять два уравнения движения - r1(t), r2(t). Далее взять, если в момент времени t траектории пересекаются, посмотреть их угол соударения, и под тем же углом их развести
#87 by supremum
а вообще, с наскоку, не зная механики, не зная математики, достаточно сложно будет.
#88 by micha
Я на время t заморачиваться не хочу, еденицей времени будет элементарная задержка в цикле потока delay
#89 by micha
Не ужели не кто не решал подобную проблему?????????
#90 by Rie
На конкретную задачу я могу ответить вполне конкретным кодом. Но - не хочу. Поскольку вся необходимая информация Вам уже была дана. В частности, в , , . Дальше можно сделать одно из двух - либо написать _вместо Вас_ код, который Вашу задачу решает (вот только зачем это надо); либо убедить Вас, что надо и своей головой чуток думать (вот как это сделать - не представляю).
#91 by bvn13
все не читал, но... насколько помню школьный курс алгебры и геометрии, для построения прямой достаточно получить функцию y(x), а потом уже простой цикл для x, вычисляем для этого х у и ставим в координаты (х,у) точку... на экране совокупность этих точек и будет прямая...
#92 by Andry888
тебе уже сто вариантов предложили, а ты все ждешь когда на блюдичке принесут...
#93 by грязный
ты можешь для начала сделать чтобы просто "ядро" летало по форме и отскакивало от краев формы? Если да, то не понятно в чем проблема.
#94 by micha
на самом деле я с вами не согласен, то что я от вас прошу, это то что я не могу найти. Подсказав мне решение (правильное) - сформирует в мозгу алгоритм решения. И в дальнейшем при возникновении данной проблемы этот алгоритм будет использован. А то что вы сказали что , , - это решение, обсалютно не факт. Да я жду от вас решения
#95 by Mort
Т.е. на форме точка которая с определенной скоростью рисует линию и текущее направление можно задать нажатием мышки? В пятом классе на бэйсике писали, автор не позорься.
#96 by Torquader
Автору непомешает почитать учебник компьютерной графики каких-нить "лохматых" годов, где обсуждаются вопросы рисования прямой линии по точкам с максимальной быстротой - там можно найти ответ на поставленный вопрос. Кратко можно сказать так: Есть точка начала A и точка, задающая вектор B. Нужно нарисовать луч AB. При этом, сначала определяем уравнение прямой AB и находим точки пересечения этой прямой с горизонтальными осями (X=0 и X=MaxScreen) и вертикальными осями (Y=0 и Y=MaxScreen) потом определить, какая точка нам нужна (то есть встретится ранее и на нужном нам луче AB, а не на луче BA). После этого мы имеем координаты двух точек A и E (найденная точка пересечения) по которым нужно провести прямую. Теперь определяем угол наклона прямой - если он меньше 45 градусов, то перебор точек ведём по горизонтальной оси, а по вертикальной проставляем из уравнения, если же он больше 45 градусов, то проставляем точки по вертикальной оси (каждую), а по горизонтальной ставим из уравнения. Получаем нашу замечательную прямую.
#97 by Rie
Алгоритм простой: Из курса физики известно, что движущаяся в плоскости материальная точка характеризуется 4-мя параметрами: координатами (x,y) и импульсом (px,py). (Поскольку массы пока не рассматриваем, импульс можно заменить на скорость (vx,vy). Это ляжет в основу класса МатериальнаяТочка. По данным двум точкам (начальной и куда мышью щёлкнули) и уравнений из курса геометрии определяем вектор скорости (vx,vy). Далее за каждый шаг (единицу времени, выбранную Вами) изменяем координаты точки на vx,vy и смотрим, не врезались ли куда при этом. Если не врезались - отрисовываем точку. Если врезались - изменяем vx,vy в соответствии с законами механики для упругого столкновения. Вот теперь - какие _конкретно_ вопросы у Вас есть? Или же, если я неверно понял стоящую перед Вами задачу, - сформулируйте _корректно_ эту задачу. Если сложности вызывает реализация именно на C# - то _какие именно_ сложности?
#98 by Andry888
я тебе его привел...
Тэги: Математика и алгоритмы
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С