LINUX.ORG.RU
ФорумTalks

c90ab (очевидное и удивительное, клуб анонимных математиков)

 ,


0

1

А как бы вы решили следующую задачу: «Даны точки A (x1, y1), B (x2, y2) и C (x3, y3). Из точки C на прямую, которая проходит через точки A и B, опущен перпендикуляр в точку D (x4, y4). Найти координаты точки D.»?

Моё решение: http://saahriktu.org/downloads/ona/c90ab.c.lzma

★★★★★

Элементарная система уравнений же. Два прямоугольных треугольника с общим катетом, при этом длины гипотенуз и сумма длин других катетов известны.

buddhist ★★★★★
()
Последнее исправление: buddhist (всего исправлений: 1)

D находится на AB? Тогда элементарно: детерминант перпендикулярных векторов равен нулю. Строим систему, решаем. Можно решить и через комплексные числа.

PS: школьную математику уже подзабыл, надеюсь, что не ошибаюсь.

beastie ★★★★★
()
Ответ на: комментарий от beastie

детерминант перпендикулярных векторов

Что это такое? Никогда не слышал такого странного названия скалярного произведения.

buddhist ★★★★★
()
Последнее исправление: buddhist (всего исправлений: 1)
Ответ на: комментарий от buddhist

И? Вопрос-то не про способ решения. Системы уравнений тоже можно по-разному составить.

saahriktu ★★★★★
() автор топика
Последнее исправление: saahriktu (всего исправлений: 1)
Ответ на: комментарий от invy

Когда сессия - уже готовый вариант не выкладывают. Интересны конечные решения других людей, которым тоже интересен вопрос. А диплом я 6 лет назад получил.

saahriktu ★★★★★
() автор топика

Система уравнений и условие перпендикулярности прямых. Не?

Solace ★★
()
Ответ на: комментарий от buddhist

Если совсем ничего не путаю, то это одно из частных решений: |A,B| = 0 ⇔ A⊥B

beastie ★★★★★
()

очевидное и удивительное

Не читал, но уверен:
очевидное: координаты D — «где-то около» А и B.
удивительное: если А, B, C — на одной прямой, то D «внутре» C.

P.S. :)

quickquest ★★★★★
()
Последнее исправление: quickquest (всего исправлений: 1)
Ответ на: комментарий от saahriktu

Ну просто обычная задача на обычную аналитическую геометрию. У тебя две прямых, через точки A,B и C,D. Записываешь уравнения. Дальше ищешь точку пересечения этих прямых(приравняв два уравнения). Получаешь систему уравнений. Добавляешь условие, что скалярное произведение векторов AB и CD (они же направляющие векторы прямых) равно нулю. (условие перпендикулярности). Получаешь ещё одно уравнение. Решаешь.

Как-то так это решалось, если мне память не изменяет.

invy ★★★★★
()
Последнее исправление: invy (всего исправлений: 1)
Ответ на: комментарий от dikiy

посмотрел твой код....

я бы проверял точки A и B на совпадение уже после вычисления |a|, по условию |a|!=0.

Потом, у тебя не рассмотрен случай, когда AB параллельна OX, а CD - не параллельна OY. Так как после x1==x2 ты сразу делаешь вывод, что Dy=y3 (что в общем случае будет неверно) и выходишь из функции.

Короче - не очень хорошее решение. Рекомендую так, как я отписал выше. И отвязано от системы координат, и всяких if не надо делать, кроме одного единственного:

if |a|=0 then return error.

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

Вот. немного доработал твою программку:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(int argc, char **argv)
{
	double x1, y1, x2, y2, x3, y3, x4, y4, k1, k2, b1, b2;
	// checking the sufficiency of the data
	if (argc < 7) {
		printf("usage: c90ab x1 y1 x2 y2 x3 y3\n");
		return 1;
	}
	// data initialization
	x1 = atof(argv[1]);
	y1 = atof(argv[2]);
	x2 = atof(argv[3]);
	y2 = atof(argv[4]);
	x3 = atof(argv[5]);
	y3 = atof(argv[6]);
	// check first exception

	l=sqrt((y2-y1)*(y2-y1)+(x2-x1)*(x2-x1))
	if (l==0.0) {
			printf("Error: line AB doesn't exists!\n");
			return 0;
	}

	skalar_produkt=((x3-x1)*(x2-x1)+(y3-y1)*(y2-y1))/l;

	x4=(x2-x1)*skalar_produkt+x1;
	y4=(y2-y1)*skalar_produkt+y1;
	printf("D (%lf , %lf)\n", x4, y4);
	return 0;
}
dikiy ★★☆☆☆
()
Последнее исправление: dikiy (всего исправлений: 4)
Ответ на: комментарий от dikiy

я бы проверял точки A и B на совпадение уже после вычисления |a|, по условию |a|!=0.

Сначала проверяются все исключения на параллельность OX и OY, и в этих случаях ничего вычислять и не нужно. И именно там и проверяется тот случай, когда A и B - одна и таже точка.

не рассмотрен случай, когда AB параллельна OX, а CD - не параллельна OY.

OY перпендикулярна OX. Если AB параллельна OX, то CD не может не быть параллельна OY.

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от saahriktu

OY перпендикулярна OX. Если AB параллельна OX, то CD не может не быть параллельна OY.

я имел в виду конечно, что CB не параллельна OY. Очепятка. Так или иначе - случай не рассмотрен и результат может быть неверным.

dikiy ★★☆☆☆
()
Последнее исправление: dikiy (всего исправлений: 1)

емнип, контрольные работы по математике за 10 класс были немного сложнее

jcd ★★★★★
()
Ответ на: комментарий от dikiy

skalar_produkt

Что это за тарабарщина? Уж лучше бы skalarnoe_proizvedenie писал тогда, если не знаешь/лень посмотреть как пишется правильно.

mix_mix ★★★★★
()
Ответ на: комментарий от dikiy

Ах да:

D=(b/|b|,a/|a|)*b+A

работает в пространстве любой размерности, в отличие от кода из топика %)

dikiy ★★☆☆☆
()
Последнее исправление: dikiy (всего исправлений: 1)
Ответ на: комментарий от dikiy

А зачем CB рассматривать отдельно? Я просто брал и поворачивал прямую AB на 90 градусов, совмещал с точкой C, а потом находил точку пересечения D. Таким образом, в случае параллельности AB и OX мне достаточно того, что CD параллельна OY, и, соответственно, при совмещении второй прямой с точкой C, x4 = x3, а y4 = y1.

saahriktu ★★★★★
() автор топика
Последнее исправление: saahriktu (всего исправлений: 1)
Ответ на: комментарий от saahriktu

А зачем CB рассматривать отдельно? Я просто брал и поворачивал прямую AB на 90 градусов, совмещал с точкой C, а потом находил точку пересечения D.

Таким образом, в случае параллельности AB и OX мне достаточно того, что CD параллельна OY, и, соответственно, при совмещении второй прямой с точкой C, x4 = y3, а y4 = x1.

да, действительно. Я почему-то только две минуты назад осознал, что ты в 2D это делаешь :)

Кстати, там в коде ошибка все еще есть. Надо заменить:

l=sqrt((y2-y1)*(y2-y1)+(x2-x1)*(x2-x1))

на

l=sqrt(((y2-y1)*(y2-y1)+(x2-x1)*(x2-x1))*((y3-y1)*(y3-y1)+(x3-x1)*(x3-x1)))

dikiy ★★☆☆☆
()
Последнее исправление: dikiy (всего исправлений: 1)
Ответ на: комментарий от jcd

емнип, контрольные работы по математике за 10 класс были немного сложнее

тут прикол в том, что при уровне знаний, превышающем оный школьника видно over9000 вариантов решения задачи, вплоть до использования барицентрических координат. И вот тут-то стоит уже задача выбора :)

dikiy ★★☆☆☆
()
Ответ на: комментарий от Harald

Расстановка акцентов.

Вместо ответа на вопрос как решить задачу, записанного, для примера, с помощь Си, ты получаешь ответ на вопрос «как написать программу на Си» реализуя, к примеру, решение задачи.

alpha ★★★★★
()
Ответ на: комментарий от alpha

для человека, осилившего С, увидеть решение в коде не проблема, я так думаю

Harald ★★★★★
()

Довольно простая задача, в трехмерном чуть сложней будет.

Eddy_Em ☆☆☆☆☆
()

Вектор AB известен? Известен. А именно он будет нормальным к CD. Значит, уравнение прямой CD пишется сразу. Уравнение прямой AB — чуть почесав репу и вспомнив, что векторное произведение AB и AD должно быть нулевым. Решаем, получаем. Всё тупо и просто.

Miguel ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.