На плоскости координатами своих упорядоченных вершин задан произвольный многоугольник и точка А. Определить число вершин, видимых из точки А
Код:
#include <stdafx.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
//структура точка
struct Point {
int x, y;
};
// структура линия
struct Line{
Point a, b;
};
int main()
{
Point *Points;
Point *A;
Line * Lines;
Line * LineA;
double *sDist, min;
int N = 0, i, j, R1 = 0, R2 = 0, index = 0;
bool flag = true;
char ch;
printf("Vvedite kol-vo tochek na ploskosti ");
scanf("%d", &N);
Points = new Point[N];
sDist = new double[N];
A=new Point[1];
Lines = new Line[N];
LineA = new Line[N];
//Цикл пока не будет нажата y или n
do {
printf("Zadat elementi sluchaino?(y/n) ");
scanf("%c", &ch);
ch = getch(); printf("%c\n", ch);
}while((ch != 'y')&&(ch != 'n'));
//Если была нажата y
if (ch == 'y'){
srand((int)time(NULL));
printf("Vvedite predel generacii dla tochek ");
scanf("%d %d", &R1, &R2);
for (i = 0; i < N; i++) {
Points[i].x = rand() % (R2 - R1) + R1;
Points[i].y = rand() % (R2 - R1) + R1;
printf("Tochka %d: (%d, %d)\n", i+1, Points[i].x, Points[i].y );
}
A[1].x = rand() % (R2 - R1) + R1;
A[1].y = rand() % (R2 - R1) + R1;
printf("Tochka A: (%d, %d)\n", A[1].x, A[1].y );
}
else { //Если была нажата n
printf("Zadaite koordinati tochkami\n ");
for (i = 0; i < N; i++) {
printf("Tochka %d ", i+1);
scanf("%d %d", &Points[i].x, &Points[i].y);
}
printf("Tochka A ");
scanf("%d %d", &A[1].x, &A[1].y);
}
//найдем самую левую из самых нижних
int base = 0;
for (int i=1;i<N;i++)
{
if (Points[i].y < Points[base].y)
base = i;
else
if (Points[i].y == Points[base].y &&
Points[i].x < Points[base].x)
base = i;
}
printf("samaya levaya iz samix niznih Tochka: (%d, %d)\n", Points[ base].x, Points[ base].y );
for (i=0; i<N; i++)
{
LineA [i].a.x =A[1].x;
LineA [i].a.y =A[1].y;
LineA [i].b.x =Points[i].x;
LineA[i].b.y =Points[i].y;
printf("Linia iz tozki A %d: (%d, %d)-(%d, %d)\n", i+1, LineA[i].a.x, LineA[i].a.y, LineA[i].b.x, LineA[i].b.y);
}
for (i=0; i<N; i++)
{
if (i==N-1)
{ Lines [N-1].a.x =Points[N-1].x;
Lines [N-1].a.y =Points[N-1].y;
Lines [N-1].b.x =Points[0].x;
Lines [N-1].b.y =Points[0].y;
}
else
{ Lines [i].a.x =Points[i].x;
Lines [i].a.y =Points[i].y;
Lines [i].b.x =Points[i+1].x;
Lines [i].b.y =Points[i+1].y;
}
printf("Linia %d: (%d, %d)-(%d, %d)\n", i+1, Lines[i].a.x, Lines[i].a.y, Lines[i].b.x, Lines[i].b.y);
}
int k=0;
for (i=0; i<N; i++)
{
for(j=0; j<N; j++)
{
// знаменатель
double Z = (Lines [j].b.y-Lines [j].a.y)*(LineA [i].b.x-LineA [i].a.x)-(Lines [j].b.x-Lines [j].a.x)*(LineA [i].b.y-LineA [i].a.y);
// числитель 1
double Ca = (Lines [j].b.x-Lines [j].a.x)*(LineA [i].a.y-Lines [j].a.y)-(Lines [j].b.y-Lines [j].a.y)*(LineA [i].a.x-Lines [j].a.x);
// числитель 2
double Cb = (LineA [i].b.x-LineA [i].a.x)*(LineA [i].a.y-Lines [j].a.y)-(LineA [i].b.y-LineA [i].a.y)*(LineA [i].a.x-Lines [j].a.x);
double Ua = Ca/Z;
double Ub = Cb/Z;
double ptx, pty;
ptx = LineA [i].a.x + (LineA [i].b.x - LineA [i].a.x) * Ua;
pty = LineA [i].a.y + (LineA [i].b.y - LineA [i].a.y) * Ua;
printf("tochka peresegheniya (%lf, %lf)\n", ptx, pty );
k=k+1;
}
}
printf("kol-vo tochek peresegheniya %d", k);
getch();
return 0;
}
не могу сообразить как именно определить видимые вершины из точки А