Форум программистов, компьютерный форум, киберфорум
Java для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 24.02.2021
Сообщений: 6

Как найти клетки с которыми пересекается отрезок заданный двумя точками(на плоскости)

24.02.2021, 08:11. Показов 2175. Ответов 8

Студворк — интернет-сервис помощи студентам
Здравствуйте, я хочу спросить совета какими максимально простыми способами можно найти с какими клетками на сетке пересекается отрезок, заданный двумя точками. Точки случайны, находятся на плоскости с осями X и Z. Точка P1(x1,z1) и P2(x2,z2). Для задач такого рода уже должны существовать простые не ресурсоёмкие решения, у меня у самого есть идея как это можно реализовать, однако я не уверен что это самый простой вариант. Свой вариант с иллюстрацией я приложу чуть позже(постараюсь в течении дня). Буду благодарен любой помощи и поддержке.
Миниатюры
Как найти клетки с которыми пересекается отрезок заданный двумя точками(на плоскости)  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.02.2021, 08:11
Ответы с готовыми решениями:

Рекурсия: Разбить отрезок, заданный двумя точками, на отрезки меньшего размера...
Есть 2 точки координат (прямой отрезок). Нужно разбить его на отрезки по меньше (конкретно < 20 метров). К координатам я не умею...

Отрезок на плоскости задается двумя не совпадающими концевыми точками X(x1,x2) и Y(y1,y2). Из точки Z(z1,z2) к прямой, с
Отрезок на плоскости задается двумя не совпадающими концевыми точками X(x1,x2) и Y(y1,y2). Из точки Z(z1,z2) к прямой, содержащей отрезок ,...

Найти расстояние между двумя точками на плоскости
Даны четыре действительных числа: x1, y1, x2, y2. Напишите функцию distance(x1, y1, x2, y2), вычисляющую расстояние между точкой (x1. y1) и...

8
 Аватар для Aviz__
2757 / 2064 / 509
Регистрация: 17.02.2014
Сообщений: 9,492
24.02.2021, 18:46
Даниил2021, https://ru.wikipedia.org/wiki/Алгоритм_Брезенхэма
2
0 / 0 / 0
Регистрация: 24.02.2021
Сообщений: 6
25.02.2021, 08:10  [ТС]
Здравствуйте, большое спасибо за помощь, однако ознакомившись с указанной вами статьёй, я заметил что в алгоритме Брезенхэма координаты точек(начало и конец) прямой являются целыми числами и привязаны к сетке(выровнены по центру). В моём же случае координаты являются значениями с плавающей точкой(не целые числа) и никак не привязаны к сетке. Также в моём случае требуется чтобы любая клетка которая пересекается с прямой была подсвечена, даже если точка пересечения является углом клетки. Алгоритм Брезенхэма оставляет клетку не закрашенной если от точки на прямой до центра клетки(по вертикали) дистанция больше 0.5 что и вызывает то что не каждая пересечённая клетка подсвечивается. Данное недопонимание возникло скорее всего из-за моего не точного изложения вопроса. Но даже так благодарю вас за помощь, данный алгоритм натолкнул меня на новые мысли и пути решения, пока что я ещё думаю как реализовать это. Приложил примеры того что нужно мне и что выдаёт алгоритм Брезенхэма.
Миниатюры
Как найти клетки с которыми пересекается отрезок заданный двумя точками(на плоскости)  
0
 Аватар для Aviz__
2757 / 2064 / 509
Регистрация: 17.02.2014
Сообщений: 9,492
25.02.2021, 08:25
Даниил2021, ты же не школьник, как я понимаю. по ссылке, что я привел, есть раздел "литература", в каждой специальной литературе есть свои термины, которые гуглшь и получаешь тысячи статей на все случаи.
1
0 / 0 / 0
Регистрация: 24.02.2021
Сообщений: 6
25.02.2021, 11:31  [ТС]
Придумал метод основанный на уравнении прямой. Метод довольно таки прост, сначала округляем в меньшую сторону координаты точек до целых чисел, и записываем это как координаты пикселей начала и конца(Зелёный цвет). Дальше по уравнению прямой сначала подставляем все значения Х(Красный) что больше первой пиксельной координаты Х и до последней пиксельной координаты Х.
Считаем по уравнению координаты Z(Синий) и округляя их(в меньшую сторону) получаем список координат пикселей. Это набор пикселей получившийся при движении по оси Х. Теперь тоже самое делаем двигаясь по оси Z. А дальше убираем дубликаты координат из двух наборов. На рисунке по порядку 1 этап, 2 этап, 3 этап. Также чтобы использовать этот метод нужно чтобы вектор отрезка был направлен в положительную четверть, иначе метод не будет работать корректно. Но это сделать не сложно, поэтому это даже не проблема. Проблема с которой я столкнулся теперь, это то что даже так если прямая пересекает точку между 4 квадратами то подкрасится лишь 2 из них. А мне требуется чтобы подкрасились все 4. Так как логически пересекая эту точку прямая пересекает все 4 квадрата. Буду думать как это исправить. Если есть идеи пишите, буду благодарен любым мыслям и помощи.

На нижнем отрезке видно что будет если вектор отрезка направлен не в положительную четверть. Начальные точки с лева, конечные справа.
Миниатюры
Как найти клетки с которыми пересекается отрезок заданный двумя точками(на плоскости)  
0
 Аватар для Tavashi
1172 / 762 / 194
Регистрация: 21.05.2016
Сообщений: 1,858
26.02.2021, 01:03
Цитата Сообщение от Даниил2021 Посмотреть сообщение
Придумал метод основанный на уравнении прямой.
Да. Можно еще попробовать представлять каждую клетку как отрезок одной из сторон параллельный оси Z и через векторное произведение двух отрезков определять есть ли пересечение. Вопрос скорее будет как дискретно описать что есть клетка, чтобы в случае пересечения определять сколько клеток нужно закрашивать.
Цитата Сообщение от Даниил2021 Посмотреть сообщение
Алгоритм Брезенхэма оставляет клетку не закрашенной если
Алгоритм Брезенхэма - это алгоритм не определяющий пересечение клеток. Это алгоритм строящий аппроксимацию прямой и всегда выбирает только одну наиболее подходящую клетку.
0
0 / 0 / 0
Регистрация: 24.02.2021
Сообщений: 6
26.02.2021, 04:16  [ТС]
Кажется я доделал метод, и теперь он должен будет работать прекрасно.
Суть метода не поменялась. Сначала зная координаты точек по уравнению прямой я составляю 2 набора координат. Сначала подставляя целые Х-сы и получая Z. Потом подставляя целые Z я получаю X-сы.

Не обязательно каждый раз считать коэффициент, его можно посчитать 1 раз и просто прибавлять при каждом новом цикле, а поскольку это 2 разных уравнения то 2 коэффициента. В конце концов всё сводится к простой арифметике, никакого деления и умножения. Теперь нужно полученные значения координат(не целые числа) округлить в меньшую сторону в java Math.floor(). И у нас получится набор координат клеток(или пикселей).


Однако теперь нужно выполнить операцию которая поможет исправить проблему с 4 квадратами. Моя тактика такова что двигаясь по значениям Х(1,2,3) подставляя их, если полученная координата Z после округления не изменится(было допустим 5, и после округления осталось 5) значит я сейчас на точке между 4 блоками, и нужно полученную координату пикселя сместить в -1 по оси Z. То есть на рисунке сдвинуть вверх. Это что нужно делать при движении по целым значениями на оси X. (Красные)

С осью Z очень похожая тактика, только если мы опять оказались на угле нужно не смещать пиксель в - по Z, а добавить новый пиксель(дополнительный) координаты которого будут такие же только -1 по оси X. То есть на рисунке сделать дубликат пикселя и сдвинуть его на клетку влево. (Синие)

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

Данное решение мне требуется для 3-х мерного пространства, но добавление ещё одной оси не меняет сути принципа. Просто нужно будет посчитать 6 коэффициентов и составить 3 списка с координатами клеток которые надо будет объединить. + нужно не забывать что если начальная Х координата и конечная находятся на одной высоте(после округления) то значит выполнять расчётов по этой оси не надо(горизонтальная линия или вертикальная). И много таких подробностей которые и не упомнить. Как напишу сам код приложу его сюда. Вот иллюстрация работы данной логики.
Миниатюры
Как найти клетки с которыми пересекается отрезок заданный двумя точками(на плоскости)  
0
0 / 0 / 0
Регистрация: 24.02.2021
Сообщений: 6
26.02.2021, 07:22  [ТС]
Также заметил что можно не делать проверку на совпадения совсем если просто изначально не добавлять конечную позицию в список клеток изначально, когда мы посчитали её в самом начале.
0
0 / 0 / 0
Регистрация: 24.02.2021
Сообщений: 6
26.02.2021, 10:16  [ТС]
Теперь попробую понять как лучше работать с отрезком если его вектор не направлен в положительную четверть. Вот нашёл зависимости от того куда направлен вектор отрезка, надо теперь вывести простую формулу для подсчёта смещения по Х и по Z в каждый цикл(движение по Х и движение по Z). Чтобы в любом направлении метод работал корректно. Так по идее меньше придётся переводить данных после вычисления позиций клеток(Так пришлось бы сначала повернуть вектор в положительную четверть, потом посчитать точки, потом повернуть обратно), а так я меняю вычисление 1 переменной 1 раз которая будет влиять на то как выбирается клетка.
Миниатюры
Как найти клетки с которыми пересекается отрезок заданный двумя точками(на плоскости)  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.02.2021, 10:16
Помогаю со студенческими работами здесь

Найти расстояние между двумя точками на плоскости
#include <stdio.h> #include <conio.h> #include <stdlib.h> #math.h main() { int x1,x2,y1,y2,d; printf("Vvesti x1,x2,y1,y2:");...

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

найти максимальное расстояние между двумя точками на плоскости
Нужно найти максимальное расстояние между двумя точка,заданными на плоскости #include <iostream> #include<math.h> ...

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

Найти периметр и площадь треугольника, используя формулу для расстояния между двумя точками на плоскости
Даны координаты трех вершин треугольника : (x1,y1,x2,y2,x3,y3 ).Найти его периметр и площадь, используя формулу для расстояния между двумя...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru