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

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

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

Здравствуйте, я хочу спросить совета какими максимально простыми способами можно найти с какими клетками на сетке пересекается отрезок, заданный двумя точками. Точки случайны, находятся на плоскости с осями X и Z. Точка P1(x1,z1) и P2(x2,z2). Для задач такого рода уже должны существовать простые не ресурсоёмкие решения, у меня у самого есть идея как это можно реализовать, однако я не уверен что это самый простой вариант. Свой вариант с иллюстрацией я приложу чуть позже(постараюсь в течении дня). Буду благодарен любой помощи и поддержке.
Миниатюры
Как найти клетки с которыми пересекается отрезок заданный двумя точками(на плоскости)  
0
 Аватар для IT_Exp
IT_Exp
34794
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
0
25.02.2021, 08:10
Здравствуйте, большое спасибо за помощь, однако ознакомившись с указанной вами статьёй, я заметил что в алгоритме Брезенхэма координаты точек(начало и конец) прямой являются целыми числами и привязаны к сетке(выровнены по центру). В моём же случае координаты являются значениями с плавающей точкой(не целые числа) и никак не привязаны к сетке. Также в моём случае требуется чтобы любая клетка которая пересекается с прямой была подсвечена, даже если точка пересечения является углом клетки. Алгоритм Брезенхэма оставляет клетку не закрашенной если от точки на прямой до центра клетки(по вертикали) дистанция больше 0.5 что и вызывает то что не каждая пересечённая клетка подсвечивается. Данное недопонимание возникло скорее всего из-за моего не точного изложения вопроса. Но даже так благодарю вас за помощь, данный алгоритм натолкнул меня на новые мысли и пути решения, пока что я ещё думаю как реализовать это. Приложил примеры того что нужно мне и что выдаёт алгоритм Брезенхэма.
Миниатюры
Как найти клетки с которыми пересекается отрезок заданный двумя точками(на плоскости)  
0
 Аватар для Aviz__
2761
25.02.2021, 08:25
Даниил2021, ты же не школьник, как я понимаю. по ссылке, что я привел, есть раздел "литература", в каждой специальной литературе есть свои термины, которые гуглшь и получаешь тысячи статей на все случаи.
1
0
25.02.2021, 11:31
Придумал метод основанный на уравнении прямой. Метод довольно таки прост, сначала округляем в меньшую сторону координаты точек до целых чисел, и записываем это как координаты пикселей начала и конца(Зелёный цвет). Дальше по уравнению прямой сначала подставляем все значения Х(Красный) что больше первой пиксельной координаты Х и до последней пиксельной координаты Х.
Считаем по уравнению координаты Z(Синий) и округляя их(в меньшую сторону) получаем список координат пикселей. Это набор пикселей получившийся при движении по оси Х. Теперь тоже самое делаем двигаясь по оси Z. А дальше убираем дубликаты координат из двух наборов. На рисунке по порядку 1 этап, 2 этап, 3 этап. Также чтобы использовать этот метод нужно чтобы вектор отрезка был направлен в положительную четверть, иначе метод не будет работать корректно. Но это сделать не сложно, поэтому это даже не проблема. Проблема с которой я столкнулся теперь, это то что даже так если прямая пересекает точку между 4 квадратами то подкрасится лишь 2 из них. А мне требуется чтобы подкрасились все 4. Так как логически пересекая эту точку прямая пересекает все 4 квадрата. Буду думать как это исправить. Если есть идеи пишите, буду благодарен любым мыслям и помощи.

На нижнем отрезке видно что будет если вектор отрезка направлен не в положительную четверть. Начальные точки с лева, конечные справа.
Миниатюры
Как найти клетки с которыми пересекается отрезок заданный двумя точками(на плоскости)  
0
 Аватар для Tavashi
1172
26.02.2021, 01:03
Цитата Сообщение от Даниил2021 Посмотреть сообщение
Придумал метод основанный на уравнении прямой.
Да. Можно еще попробовать представлять каждую клетку как отрезок одной из сторон параллельный оси Z и через векторное произведение двух отрезков определять есть ли пересечение. Вопрос скорее будет как дискретно описать что есть клетка, чтобы в случае пересечения определять сколько клеток нужно закрашивать.
Цитата Сообщение от Даниил2021 Посмотреть сообщение
Алгоритм Брезенхэма оставляет клетку не закрашенной если
Алгоритм Брезенхэма - это алгоритм не определяющий пересечение клеток. Это алгоритм строящий аппроксимацию прямой и всегда выбирает только одну наиболее подходящую клетку.
0
0
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
26.02.2021, 07:22
Также заметил что можно не делать проверку на совпадения совсем если просто изначально не добавлять конечную позицию в список клеток изначально, когда мы посчитали её в самом начале.
0
0
26.02.2021, 10:16
Теперь попробую понять как лучше работать с отрезком если его вектор не направлен в положительную четверть. Вот нашёл зависимости от того куда направлен вектор отрезка, надо теперь вывести простую формулу для подсчёта смещения по Х и по Z в каждый цикл(движение по Х и движение по Z). Чтобы в любом направлении метод работал корректно. Так по идее меньше придётся переводить данных после вычисления позиций клеток(Так пришлось бы сначала повернуть вектор в положительную четверть, потом посчитать точки, потом повернуть обратно), а так я меняю вычисление 1 переменной 1 раз которая будет влиять на то как выбирается клетка.
Миниатюры
Как найти клетки с которыми пересекается отрезок заданный двумя точками(на плоскости)  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 Аватар для BasicMan
BasicMan
29316
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
Ответ Создать тему
Новые блоги и статьи
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов. Сигнатура func Fetch(urls string, maxConcurrent int) Result Пример urls :=. . .
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition) Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
[golang] Worker Pool
alhaos 09.06.2026
Worker Pool Worker Pool — паттерн конкурентной обработки задач в Go. Суть: фиксированное количество горутин-воркеров читают задачи из общего канала и пишут результаты в общий канал результатов. . . .
[golang] Pipeline
alhaos 08.06.2026
Pipeline Pipeline — паттерн конкурентной обработки данных в Go. Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru