Точка в треугольнике - C (СИ)
Формулировка задачи:
У меня проблема с такой задачей.
Захватив Изумрудный город Урфин Джюс поручил генералу Лану Пироту поставить деревянного солдата в каждый двор города. Все дворы Изумрудного города представляют собой треугольники, солдат должен находиться либо внутри треугольника, либо на его границе. Вам необходимо проверить, справился ли Лан Пирот с поставленной задачей.
Формат входного файла trian.dat
Текстовый файл trian.dat содержит четыре строки. В первых трех строках записаны координаты вершин треугольника - по два целых числа X, Y, разделенных пробелом, в строке (-1000000 ≤ X, Y ≤ 1000000). Гарантируется, что эти три вершины не лежат на одной прямой.
Четвертая строка файла содержит координаты точки, в которой стоит деревянный солдат Урфина Джюса, - два целых числа A, B, разделенных пробелом (-1000000 ≤ A, B ≤ 1000000).
Формат выходного файла trian.sol
Текстовый файл trian.sol должен слово YES, если точка с координатами (А,В) лежит внутри треугольника или на его стороне, и NO в противном случае.
Покажите готовый код или подскажите хотя бы алгоритм.
Решение задачи: «Точка в треугольнике»
textual
Листинг программы
#include <stdio.h>
int main() {
long long int xa, ya, xb, yb, xc, yc, xd, yd;
long long int S1 = 0, S2 = 0, S3 = 0, S4 = 0, S = 0;
FILE *fp, *np;
fp = fopen("trian.dat", "r");
np = fopen("trian.sol", "w");
fscanf(fp, "%lld %lld", &xa, &ya);
fscanf(fp, "%lld %lld", &xb, &yb);
fscanf(fp, "%lld %lld", &xc, &yc);
fscanf(fp, "%lld %lld", &xd, &yd);
S1 = (xb - xa) * (yc - ya) - (xc - xa) * (yb - ya);
if(S1 < 0) {
S1 = -S1;
}
S2 = (xb - xa) * (yd - ya) - (xd - xa) * (yb - ya);
if(S2 < 0) {
S2 = -S2;
}
S3 = (xc - xb) * (yd - yb) - (xd - xb) * (yc - yb);
if(S3 < 0) {
S3 = -S3;
}
S4 = (xd - xa) * (yc - ya) - (xc - xa) * (yd - ya);
if(S4 < 0) {
S4 = -S4;
}
S = S2 + S3 + S4;
if(S == S1) {
fprintf(np, "YES\n");
}
else {
fprintf(np, "NO\n");
}
fclose(fp);
fclose(np);
return 0;
}
Объяснение кода листинга программы
В этом коде выполняется вычисление площади треугольника по координатам вершин и определение, является ли эта площадь положительной или отрицательной. Вот список действий:
- Ввод координат вершин треугольника из файла
trian.dat. - Вычисление площади треугольника, используя формулу Герона.
- Если площадь отрицательна, то инвертирование знака площади.
- Вывод результата на экран с помощью функции fprintf.
- Закрытие файлов для ввода и вывода.
- Возврат значения 0, что означает успешное выполнение программы.