Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.12.2010, 21:58   #1
kochet-kov
Пользователь
 
Регистрация: 17.12.2010
Сообщений: 19
Восклицание подправьте код задачи С++

На плоскости координатами своих упорядоченных вершин задан произвольный многоугольник и точка А. Определить число вершин, видимых из точки А
Код:
#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;
}



не могу сообразить как именно определить видимые вершины из точки А
kochet-kov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
подправьте коротенький код... MyLastHit Общие вопросы Delphi 22 06.08.2010 22:54
подправьте код программы сразу В НОВОМ ЧИСТОМ ЭКРАНЕ ОКНЕ ВЫВОДИЛОСЬ СОДЕРЖИМОЕ ФАЙЛА t.txt Kolyan56577 Помощь студентам 3 22.06.2010 17:09
подправьте код Delphi 7 savra Помощь студентам 0 14.12.2009 10:41
Подправьте мой код пожалуйста Volchara Общие вопросы C/C++ 5 06.04.2009 17:05