Найти две точки, образующие прямую, параллельную наибольшему количеству заданных прямых
На тему "Геометрия"
- Формулировка задания
- Уравнение прямой по двум точкам
- Перебор множеств точек и прямых
- Визуальное представление на Координатной плоскости
- Случайная генерация множест точек и прямых
- Исходный код на C#
С визуальным представлением на координатной плоскости
Формулировка задания
звучит так:
На плоскости задано множество точек А и множество прямых В.
Найти две различные точки из А такие, чтобы проходящая через них прямая была параллельна наибольшему количеству прямых из В.
Рис.1 Найти две точки, образующие прямую, параллельную наибольшему количеству заданных прямых
Уравнение прямой по двум точкам
Уравнение вида y(x) = y0 + k * x ,
где k = (dy/dx) = тангенс угла наклона прямой,
а y0 - значение функции при х=0 (точка пересечения прямой с осью оХ)
найти легко…
k = (y2 - y1)/(x2 - x1)
y0 = y1 - k*x1 (или y0 = y2 - k*x2)
Перебор множеств точек и прямых
Перебор множества точек «А» следует выполнять в двух циклах, так как точки рассматриваются парами.
Из пары точек получить прямую tmpLine (ее параметры - как, описано выше). Для определения параллельности необходимо сравнить k (наклон) прямой tmpLine и каждой прямой из множества «B».
//------------------------------
for (int i = 0; i < siz1-1; i++){
p1 = arrPoints[i];
for (int j = i + 1; j < siz1; j++) //перебор пар точек
{
p2 = arrPoints[j];
tmpLine = new geoLine(p1, p2);
cou = 0;
for (int k = 0; k < siz2; k++)//перебор заданныx линий
{
if (tmpLine.k == arrLines[k].k) cou++;//подсчет параллельных прямых
}
if (cou > maxTim) // зафиксировать лучший результат
{
pA = p1; pB=p2; //пара точек образующих lineAnswer
lineAnswer = tmpLine;
maxTim = cou;
}
}
}
//------------------------------
Визуальное представление на Координатной плоскости
Координатная плоскость (из школькой программы) и координатная плоскость формы Windows (c её параметрами left, top в пикселях) отличаются друг от друга, но математическими преобразованиями всегда можно связать любые две координатные системы отсчета.
Т.е. необходимо решить подзадачу: из имеющихся координат точки (любой) в системе_1, получить координаты этой же точки в системе_2.
В программном коде это решение представлено. Тестируйте…
Случайная генерация множест точек и прямых
Чтобы не утруждать пользователя вводом координат точек и параметров прямых - множество точек «А» и прямых «B» генерируются случайным образом.
//------------------------------
siz1 = (int)numericUpDown1.Value; siz2 = (int)numericUpDown2.Value; //размеры массивов для точек и прямых
arrPoints = new Point[siz1]; //cоздается массив нужного размера для хранения точек
arrLines = new geoLine[siz2];//cоздается массив нужного размера для хранения объектов "прямые линии"
Random rnd = new Random();
//заполнить массивы точек и прямых линий
//------------------------------
Исходный код на C#
Данный код написан на Visual Studio 2012, но для всех старших версий проблем с открытием быть не должно.
В крайнем случае, свяжемся и все проблемы решим…
скачать ехе-файл для тестирования
Другие примеры на языках «C»,«C++»
Другие примеры на тему «Математические методы компьютерной 2D 3D графики»
Если у Вас остались вопросы, то задать их Вы можете, нажав на эту кнопочку ...
Поделиться в соц сетях: