1 | ||||||
Построить четырехугольник по заданным точкам23.07.2014, 01:58. Показов 4591. Ответов 34
Метки нет (Все метки)
Есть задача: даны (четыре) точки пересечения со сторонами четырехугольника перпендикуляров, опущенных на стороны из точки пересечения его диагоналей. Построить четырехугольник.
Математика решения более-менее выяснена и реализована. Для каждой исходной конфигурации точек строятся 2 кривые, точки пересечения которых могут являться точкой пересечения диагоналей искомого четырехугольника, по которой (и исходным четырем точкам) он однозначно строится. Сделал из этого анимашку: исходные точки таскаются мышкой, при этом меняются кривые, пересечение которых дает решения. При щелчке мышкой далее, чем 5% от любой исходной точки, выполняется поиск решения в окрестности точки щелчка (лучше целенаправленно щелкать в точки пересечения кривых) и строится это решение. Сделано весьма коряво, это мой первый опыт создания GUI, буду признателен за любые дельные советы и замечания.
0
|
23.07.2014, 01:58 | |
Ответы с готовыми решениями:
34
Построить график кривой по заданным точкам Как нарисовать на Canvas четырехугольник по заданным точкам? Как построить сплайн по заданным точкам Построить квадрат по двум заданным точкам |
23.07.2014, 17:07 [ТС] | 3 | |||||
letete, пересекающийся четырехугольник это нормально, математическая формализация дает выполнение условий задачи, не накладывая дополнительных ограничений - можете подвинуть исходные точки, чтобы они задавали также пересекающийся четырехугольник - посмотрите на результат.
ЗЫ говорите, вам нравится, а если бы мне по основной работе пришлось встретиться с подобной корявостью (как в коде, так и в интерфейсе), я бы составил вполне определенное мнение о программисте и его квалификации Сейчас продолжаю шлифовать код, обнаружил много забавного - оказывается в Матлабе в типах полей ввода нет числа, только строки - и в хелпе приведен корявый пример обработки этого имхо безобразия:
0
|
23.07.2014, 18:14 | 4 | ||||||||||
_Ivana, от кавычек матлаб отходит, слава богу, - лучше использовать @. Это вполне себе обычные указатели на функции. Как передавать параметры - зависит от контекста. В строке, например,
Что касается в целом о мысли что все хорошо - то да, по сравнению с тем, что здесь иногда почитываешь, дак да - программа просто идеальна)) На самом же деле программу с GUI лучше всего писать примерно так (я, конечно, не претендую на истину в последней инстанции, но как мне кажется, вложенные функции упрощают код). С точки зрения рекурсивного вызова (а именно так у Вас в программе все работает) - это конечно не очень хорошо, хотя и, должен признать, весьма элегантно)) Добавлено через 13 минут и еще. по поводу ... проблема в том, что матлаб объективно не очень ориентирован на пользовательские интерфейсы - ну не его это специализация, прямо скажем; из-за этого (по-видимому) и возникают некоторые трудности и "безобразия". Например, я очень долго боролся с полосой прокрутки, которая по умолчанию ВСЕГДА висит в листбоксах, проверка вводимых значений для едитбоксов и много чего другого... Для edit'а действительно нет нормального обработчика: Callback - это все таки реакция на событие LOSTFOCUS, а хотелось бы сильно чтобы было ONCHANGE... я как будет время запишу по этому поводу в блоге что-нить, ну а сейчас прямо могу дать несколько ссылок: listbox_scroll_bar, edit_change, и вообще!
1
|
23.07.2014, 18:22 [ТС] | 5 |
letete, спасибо Вам большое за ссылки и участие в теме. Я их почитаю, сделаю по возможности с учетом их рекомендаций и выложу код. И если Вам опять же будет не трудно, мне очень интересно будет почитать его критику )
0
|
23.07.2014, 18:41 | 6 |
чёта я призадумался... мне почему-то кажется, что
работать не будет... То есть работать будет, но не так, как хотелось бы...
Дело в том, что Callback - это специальная функция, у которой УЖЕ ЕСТЬ параметры. А именно: (handle, event). Т.е. автоматически в функцию (по идее) должен передаваться дескриптор объекта, вызывающего Callback и объект события. В большинстве случаев event не используется (в реализации функции можно заменить ~). Конструкция {@GUI_test, -1} позволяет добавлять дополнительные аргументы, поэтому -1 в данном случае будет третьим параметром. Наверно. Кажется. Наверняка не уверен - надо проверять. Проверять мне, понятное дело, не хочется - проще переписать функцию с вложенными функциями - тогда все станет на свои места само, не нужно будет изобретать велосипедов.
0
|
23.07.2014, 18:53 [ТС] | 7 | |||||
Работает, передает третьим параметром:
ЗЫ сейчас бьюсь над сверхзадачей - сделать какое-то поле (эдит, скорее всего), где будут визуализироваться координаты 4 точек (сделано), рефрешиться при таскании (сделано), и там же будет можно их задавать - не сделано, не побеждается преобразование из многострочной строки в матрицу даблов 4х2...
0
|
23.07.2014, 19:02 | 8 | |||||
_Ivana, хорошо. Тогда пойдем дальше)) А зачем вообще третий параметр?
0
|
23.07.2014, 19:11 [ТС] | 9 |
) идея понятна, и если на разных кнопках совсем разные функции - то вполне красиво. Но если функция по сути одна и та же, при разбитии на 2 будет дублирование 95% кода - что некрасиво. Хотя его можно вынести в третью функцию - но это имхо также некрасиво. В общем, дело вкуса, но в данном случае имхо лучше одна функция с параметром.
ЗЫ но по сравнению с этим вопросом у меня несколько других более насущных проблем стоит, хотя бы изложенная в предыдущем посте
0
|
23.07.2014, 19:21 [ТС] | 11 | |||||
Сейчас мой код выглядит так:
Да, теперь для построения решения надо правой кнопкой мыши жать
1
|
23.07.2014, 19:29 | 12 | |||||
так это и есть str2num.
Но естественно, что надо будет сначала потерять фокус (чтобы Callback сработал)
1
|
23.07.2014, 19:49 [ТС] | 13 |
Сейчас попробую. Возможно, меня смутило то, что есть уже str2double...
А по остальному что скажете, если без поблажек? Добавлено через 14 минут Отработало. Стыдно, что сам не попробовал так просто и напрямую, думал только целые значения возвратит... Хотя еще надо защиту от некорректных введенных данных туда лепить. ЗЫ теперь хочется избавиться от хранения отдельно координат исходных точек, а брать их из xdata ydata точек вывода (это просто), и как-то может покрасивее определять какую точку мы двигаем мышью, да и вообще задавать каждую точку не отдельно, а все одним массивом...
0
|
23.07.2014, 20:03 | 14 | |||||||||||||||
а что сказать в остальном? красиво, богато... структуру (h.*) достаточно сложную Вы используете (это не критика - это намек, что рядышком весьма так недурственно было бы комментарий написать как именно ею пользоваться и из чего она состоит - иначе не то что посторонний, сами же через недельку без поллитра не разберетесь как она сформирована).
второе - употребляете gcf. это, конечно, хорошо, но это GetCurrentFigure. т.е. было бы лучше сделать первой строчкой
Вообще говоря, на вкус и цвет, как говорится, все люди разные! )) Добавлено через 10 минут с целыми значениями в матлаб очень туго. их почти нет. все значения по умолчанию - double. чтобы использовать чисто целые значения надо сильно постараться. целочисленные типы: int8, int16, int32, int64, uint8, uint16, uint32, uint64 но их использование крайне не желательно. дело в том, что не все функции умеют с ними работать (конечно, список этих функций расширяется с каждой версией, но все же...) есть еще тип single (аналог - float, 4Б, одинарная точность), так вот даже он не всегда адекватен по поводу проверки. str2num вернет массив чисел, и только лишь в тех местах, где не получилось конвертировать, там будут NaN (NotANumber). так что не так уж и сложна будет проверка. функция isnan() скажет, если что-то не так.
1
|
23.07.2014, 20:12 [ТС] | 15 |
letete, очередное спасибо Вам за дельные советы и рекомендации. Я понимаю, что совершенствовать код и интерфейс можно бесконечно, и надо остановиться на каком-то компромиссе, но сейчас я не чувствую что достиг его Ну, например, пока еще имхо рано этот код давать как демо пример графического GUI. Буду пытаться шлифовать дальше. Многие моменты мне еще не нравятся, часть я озвучил выше. Если у вас появятся какие-либо мысли или идеи - буду рад почитать.
ЗЫ isnan() это хорошо, это и в хелпе так проверяется. Только еще размерность надо проверить, а то все будет хорошо с числами, но юзер или удалит часть или лишних влепит
0
|
25.07.2014, 00:56 [ТС] | 17 | |||||
Финальный вариант на сегодня: удалены лишние поля структуры, немного пошлифован интерфейс... Uitable попробовал, до конца не довел, оставил текстовое поле, но коллбэк по кнопке. Не знаю что еще придумать.
Добавлено через 23 часа 23 минуты Вести с полей - доработал вариант с uitable: отличная вещь! Столько свойств и полей, коллбэк по выбору и редактированию каждой ячейки с возможностью взять предыдущее и новое значения, задания типов ячеек с автоматическим контролем при вводе, жесткое но динамически изменяемое ограничение количества строк/столбцов и еще море всего вкусного Жаль только, что не удаляются заголовки строк/столбцов (или не нашел как) и в тексте было одно преимущество - было возможно копировать содержимое из поля и вставлять в поле штатными средствами Windows. Это важный момент, облегчает таскание координат точек из кода в поле и обратно. Но у таблицы есть возможность запрограммировать UIContextMenu и там задать команды копирования/вставки через текст, если получится.
1
|
25.07.2014, 13:54 | 18 | |||||
_Ivana, насколько я помню колбэки у таблиц позволяют анализировать содержимое при потере фокуса от ячейки - это значит можно сразу же обрабатывать содержимое ячеек, а еще каждая ячейка допускает HTML-форматирование... вобщем на коленках примерчик собрал:
Важное замечание: лучше, чтобы содержимым таблицы были ячейки. Иначе не получится совместить текст и числа
1
|
25.07.2014, 13:56 [ТС] | 19 |
Спасибо, я все более проникаюсь впечатлением от возможностей таблиц по сравнению с более простыми элементами.
ЗЫ если уж на то пошло, то вместо всех этих эдитов и слайдеров можно нарисовать еще одно управляющую графическую область, задать для нее коллбэки нажатия кнопок мыши и таскания, нарисовать ВСЕ ЧТО УГОДНО и по текущим координатам делать изменения нужных параметров
0
|
25.07.2014, 14:06 | 20 |
_Ivana, пожалуйста!
Всегда приятно помогать адекватным людям, а не ковыряться в элементарных ошибках студентов, которым надо сдать "срочна! вчира! памагите..." Матлаб достаточно богат и развит, но не все его возможности лежат на поверхности. Я им занимаюсь всего полгода и, откровенно говоря, не знаю о нем вообще ничего. Для Вас, возможно, будет полезна (кроме прочих) еще вот эта книга - ее достаточно трудно найти и она, к сожалению, немножко англоязычна.
2
|
25.07.2014, 14:06 | |
25.07.2014, 14:06 | |
Помогаю со студенческими работами здесь
20
Построить прямоугольник по двум заданным точкам Построить прямоугольник по двум заданным точкам Определить, можно ли по заданным точкам построить прямоугольник Построить кривую параболического типа по 4 точкам, заданным с помощью локатора Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |