Практика программирования (Бейсик, Си, Паскаль)


Задачи,советы и ответы - часть 47


Совет 1 (общий)

Воспользуемся известным фактом — любая прямая (А*х+в*у+с=о) делит плоскость на две полуплоскости. Все точки, принадлежащие одной полуплоскости, при подстановке в уравнение .прямой дают значение A*х+B*у+с одного знака, а все точки другой полуплоскости — значение противоположного знака.

Поэтому, если точка р находится строго внутри треугольника две, то точки А и Р находятся в одной полуплоскости по отношению к прямой вс, точки В И Р — в одной полуплоскости по отношению к прямой АС, точки С И Р - в одной полуплоскости по отношению к прямой АВ.

Программа 2_27.bas

RЕМ Анализ взаимного расположения точки и треугольника

DECLARE FUNCTION R!(U!,V!,Ul!,VI!,U2!,V2!)

PRINT "Введи координаты вершин треугольника"

INPUT X1,Y1,X2,Y2,X3,Y3

'XI = 0: Yl = 0: X2 = 0: Y2 = 1: X3 = 1: Y3 = 0

PRINT "Введи координаты точки" INPUT X, Y

IF (R(X,Y,X1,Y1,X2,Y2)*R(X3,Y3,XI,Yl,X2,Y2)>0 AND R(X,Y,X2,Y2,X3,Y3)*R(X1,Y1,X2,Y2,X3,Y3)>0

AND R(X,Y,X1,Y1,X3,Y3)*R(X2,Y2,X1,Y1,X3 Y3)>0) THEN

PRINT "Точка находится внутри треугольника": END

END IF

IF (R(X,Y,X1,Y1,X2,Y2)*R(X3,Y3,X1,Y1,X2,Y2)<0

OR R(X,Y,X2,Y2,X3,Y3)*R(X1,Y1,X2,Y2,X3,Y3)<0

OR R(X,Y,X1,Y1,X3,Y3) *R(X2,Y2,X1.,Y1,X3,Y3)<0) THEN

PRINT "Точка находится вне треугольника": END

END IF

PRINT "Точка принадлежит границе" END

FUNCTION R(U,V,U1,V1,U2,V2)

REM Анализ взаимного расположения точки (U,V) и прямой,

RЕМ проходящей через точки (U1,V1) и (U2,V2)

R=0

IF ((U-U1)*(V2-V1)-(V-V1)*(U2-U1)>0) THENR=1

IF ((U-U1)*(V2-V1)-(V-V1)*(U2-U1)<0) THENR=-1

END FUNCTION

Программа 2_27.c

/* Анализ взаимного расположения точки и треугольника */

#inclucte <stdio.h>

#include <iconic. h>

int r(float u,float v,float ul,float vl, float u2,float v2);

main () {

float X0,y0,xl,yl,x2,y2,x3,y3;

float k012,k012, k023, k123, K312, k213;

printf("\n Введи координаты вершин треугольника\п");

scanf("%f %f %f %f %f %f",&xl,&yl,&x2,&y2,&x3,&y3);




- Начало -  - Назад -  - Вперед -