Форум программистов, компьютерный форум, киберфорум
Delphi: Графика, звук, видео
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 16.11.2021
Сообщений: 32

При запуске программы на форме появляется линия

20.01.2022, 08:21. Показов 4476. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите написать код, к одной из этих задач. Пожалуйста, буду благодарен.

1.При запуске программы на форме появляется линия. При
наведении курсора на линию изменяются толщина и цвет линии.
Нажатие в этом состоянии на левую клавишу мыши изменяет форму
курсора: 1) если курсор находился на конце линии, то форма курсора
отражает состояние «резиновая нить», в этом состоянии мы можем
изменить положение конца линии путем перемещения мыши в другую
точку; 2) если курсор находился в средней части линии, то форма
курсора отражает состояние «перенос линии», в этом состоянии
перемещение мыши приводит к параллельному перемещению линии по
экранной форме.
Отпускание мыши приводит задачу в исходное состояние, при
этом линия остается в положении, которое она приняла в результате
манипуляций.
Используются события класса TForm: OnMouseDown,
OnMouseMove, OnMouseUp. Для моделирования состояния задачи ввести
с помощью перечислимого типа данных значения состояний:
«исходное», «параллельный перенос линии», «сдвигать линию
относительно конца 1», «сдвигать линию относительно конца 2».
Требование: линия должна моделироваться отдельным классом.

2.
При запуске программы на экранной форме появляются
две фигуры: круг и квадрат. С помощью устройства «мышь» фигуры
должны перемещаться по форме. Используются события класса TForm:
OnMouseDown, OnMouseMove, OnMouseUp. Ограничение: фигуры не
должны пересекать границы клиентской области формы.
Предусмотреть класс фигура (TFigure) и его потомков: круг (TCircle),
квадрат (TSquare). Метод перемещения фигур должен быть
полиморфным.
Требование: предполагается, что в будущем могут появиться
новые фигуры, а существующие – исключены, поэтому программа
должна обладать свойством модифицируемости.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.01.2022, 08:21
Ответы с готовыми решениями:

не появляется анимация при запуске программы
Выдали практическую мне в одном из заданий нужно разместить 6 компонентов Animate и кнопку. Установить в компонентах Animate следующие...

Появляется картинка при запуске программы
Всем привет! Как сделать, чтобы при запуске программы, появилось сначала изображение (в течении 3 секунд), по истечению 3 секунд, оно...

Не появляется DataGritView при запуске программы
Form4.Designer namespace Weekly_Report { partial class Form4 { /// <summary> /// Обязательная...

33
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
20.01.2022, 17:35
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от AzAtom Посмотреть сообщение
При том, что ты его использовал.
Цитата Сообщение от AzAtom Посмотреть сообщение
Красная область это то место, где будет определено, что курсор попал на линию
С точки зрения чистой математики возможно, там и получается условный эллипс. А теперь ответь на такой вопрос - с точки зрения человеческого восприятия так ли это существенно (особенно при коэффициенте 0,01)? отличишь ли ты на глаз это? Сможешь ли позиционировать курсор так, чтобы отследить эти изменения (учитывая, что шаг указателя может быть больше, чем данный коэффициент)? Измени коэффициент на 0,001 и получишь визуальную линию

Добавлено через 4 минуты
Геометрия (планиметрия) оперирует понятиями "прямая" и "точка". Прямая - одномерный "объект", точка вообще не имеет размерностей. Алгоритм решения задачи базируется на планиметрии, а все эти коэффициенты и погрешности - это уже издержки программирования, применяемые для того, чтобы реализация как можно более точно соответствовала алгоритму. Исходя из этого, считаю дальнейшие прения насчёт элиипсов бессмысленными

Добавлено через 4 минуты
AzAtom, разверни ситуацию на 180 градусов и ответь мне
- Сможешь ли ты построить на бумаге отрезок длинной 15,123456 см?
Вот то-то же )
0
Модератор
4152 / 2361 / 814
Регистрация: 15.11.2015
Сообщений: 9,494
20.01.2022, 17:44
Цитата Сообщение от DenNik Посмотреть сообщение
Измени коэффициент на 0,001 и получишь визуальную линию
Изменил. И даже попытался попасть в эту линию. У краёв неудобно.

Цитата Сообщение от DenNik Посмотреть сообщение
считаю дальнейшие прения насчёт элиипсов бессмысленными
Тем более, что каждый останется при своём мнении.
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
20.01.2022, 17:58
Цитата Сообщение от AzAtom Посмотреть сообщение
У краёв неудобно
Значит, не нужно ставить такой коэффициент. Я рекомендую использовать значения от 0,05 до 0,1 Опять же, с пользовательской точки зрения ты не заметишь разницы.
Вообще, сама задача, её класс, цель и "стоимость" не требует поиска и применения более совершенного алгоритма. Поигрались, мозг поразмяли и хватит. Тем более, задача чужая. Кто захочет, изменит код метода PointIn для более точного определения. Я разрешаю
0
 Аватар для Пытливый
3764 / 2272 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
20.01.2022, 22:32
Есть замечательная WinApi функция LineDDA(), которая позволяет получить все точки на линии и не надо ничего вычислять.
1
Модератор
4152 / 2361 / 814
Регистрация: 15.11.2015
Сообщений: 9,494
20.01.2022, 23:03
Пытливый, так-то мы и не вычисляли все точки на линии.

Интересная функция.
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
20.01.2022, 23:26
Хм, согласен, интересно. Получилось нарисовать линию с помощью этой функции

Добавлено через 1 минуту
Создав массив точек, принадлежащих линии, можно просто проверять искомую точку на предмет вхождения в массив

Добавлено через 2 минуты
Ложка дёгтя заключается в том, что пиксель весьма мал и захватить такую линию будет весьма проблематично, особенно с похмелья).
0
 Аватар для Пытливый
3764 / 2272 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
21.01.2022, 00:17
Цитата Сообщение от DenNik Посмотреть сообщение
Хм, согласен, интересно. Получилось нарисовать линию с помощью этой функции
Добавлено через 1 минуту
Создав массив точек, принадлежащих линии, можно просто проверять искомую точку на предмет вхождения в массив
Добавлено через 2 минуты
Ложка дёгтя заключается в том, что пиксель весьма мал и захватить такую линию будет весьма проблематично, особенно с похмелья).
Можно и не рисовать, а получать только массив координат, ну а проверять координаты мыши можно и по увеличенной области, примерно так:
Delphi
1
if Rect(Coord[i].X-1,Coord[i].Y-1,Coord[i].X+1,Coord[i].Y+1).Contain(MouseX,MouseY) then ...
Тут есть еще проблемка - толщина линии может быть любая, поэтому ее тоже надо учитывать.
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
21.01.2022, 00:49
Пытливый, я уже нашел неплохой вариант. Каждую точку линии я "превращаю" в квадрат 2х2, создаю комбинированный регион HRGN, а потом просто проверка PtInRegion
0
Модератор
4152 / 2361 / 814
Регистрация: 15.11.2015
Сообщений: 9,494
21.01.2022, 08:52
Чего только люди не придумают вместо того, чтобы выполнить несколько арифметических операций и получить расстояние до линии за один приём?

Переделал формулу, исключил извлечение квадратного корня:
Delphi
1
2
3
    d := SQR((y2-y1)*X - (x2-x1)*Y + x2*y1 - y2*x1) / (SQR(y2-y1) + SQR(x2-x1));
    if (d <= 9) and PtInRect2(FRect, X, Y) then
      Result := lsMove;
И всё, срабатывает на расстоянии 3 пикселя до линии.
3
Айлурофил
 Аватар для Massaraksh7
518 / 451 / 112
Регистрация: 27.05.2017
Сообщений: 2,748
Записей в блоге: 7
10.06.2024, 17:48
Есть стандартные геометрические формулы по расстоянию от точки до прямой.
Вот их реализация:
nx,ny - координаты первой точки отрезка
nx2,ny2 - координаты второй точки отрезка
X,Y - координаты точки
5 - диапазон (диаметр) попадания
Delphi
1
2
3
4
5
6
7
8
a:=ny2-ny;b:=nx-nx2;c:=ny*(nx2-nx)-nx*(ny2-ny);
try d:=Abs(a*X+b*Y+c)/sqrt(a*a+b*b); except d:=100; end;
if nx2>nx then begin fx2:=nx2+5;fx1:=nx-5;end else begin fx2:=nx+5;fx1:=nx2-5;end;
if ny2>ny then begin fy2:=ny2+5;fy1:=ny-5;end else begin fy2:=ny+5;fy1:=ny2-5;end;
if (d<5) and (x<=fx2) and (x>=fx1) and (y<=fy2) and (y>=fy1) then 
       begin 
//----Попадание
       end;
Аналог того, что у AzAtom
0
 Аватар для Пытливый
3764 / 2272 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
10.06.2024, 18:34
Цитата Сообщение от AzAtom Посмотреть сообщение
Чего только люди не придумают вместо того, чтобы выполнить несколько арифметических операций и получить расстояние до линии за один приём?
Цитата Сообщение от Massaraksh7 Посмотреть сообщение
Есть стандартные геометрические формулы по расстоянию от точки до прямой.
Формулы это конечно хорошо, но если используются разные методы округления при рисовании и расчетах, то вы не получите 100% совпадения координат, особенно это будет заметно при сглаживании.
0
Айлурофил
 Аватар для Massaraksh7
518 / 451 / 112
Регистрация: 27.05.2017
Сообщений: 2,748
Записей в блоге: 7
10.06.2024, 18:56
Цитата Сообщение от Пытливый Посмотреть сообщение
то вы не получите 100% совпадения координат, особенно это будет заметно при сглаживании.
Не нужно 100% совпадения, нужно попадание в какую-то заданную окрестность.
0
 Аватар для Пытливый
3764 / 2272 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
10.06.2024, 20:57
Цитата Сообщение от Massaraksh7 Посмотреть сообщение
Не нужно 100% совпадения, нужно попадание в какую-то заданную окрестность.
Окрестность получают как квадрат с центром в точке отсчета, а если точка отсчета сдвинута, то и все остальное тоже будет сдвинуто. Я как-то пробовал делать такое, используя формулы и столкнулся с этой проблемой. Для прямоугольных координат погрешность была не существенной, но для произвольной фигуры это уже имеет значение.
0
Айлурофил
 Аватар для Massaraksh7
518 / 451 / 112
Регистрация: 27.05.2017
Сообщений: 2,748
Записей в блоге: 7
10.06.2024, 23:09
Цитата Сообщение от Пытливый Посмотреть сообщение
Окрестность получают как квадрат с центром в точке отсчета
Вообще-то, обычно окружность, а не квадрат.
Во-вторых, вот пример и для "линии", и для "точки".
Миниатюры
При запуске программы на форме появляется линия  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.06.2024, 23:09

При запуске программы окружность не появляется
При запуске программы окружность не появляется. В чем проблема?

JFrame при запуске программы форма не появляется
Добрый день, начал осваивать Яву, и тут же наткнулся на первые грабли. Создал приложение по этому пособию...

При запуске программы появляется следующая ошибка
Здравствуйте. Подскажите, пожалуйста, чем может быть вызвана эта ошибка?

Почему при запуске программы в программе появляется консоль?
Код программы, которая запускает саму себя через некоторое время: {$apptype windows} uses GraphABC; begin ...

Консоль появляется только на мгновение при запуске программы
Консоль появляется только на мгновение при запуске программы. Пробовал Eclipse, Netbeans . ОС Windows 8.1 Industry Pro x64, JDK 7. Помогите...


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

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Новые блоги и статьи
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
SUNO Ai - Река Без Дна
zorxor 31.07.2026
Автор стихотворения - астрофизик Марина Катыс Ссылка на сгенерированную музыкальную композицию: https:/ / suno. com/ song/ 6f6e5464-b290-4650-be6c-44c85f8d8013 Я говорю, что Время- как вода течет. . .
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Салют, шампанское, овации! :drink:
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru