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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.02.2011, 12:04   #1
Kovy
Пользователь
 
Регистрация: 23.01.2011
Сообщений: 11
По умолчанию Ошибка при вычислениях.

Подскажите плз. В Мейне в Switch пункты 2 и 4 работают неправильно(
в пункте 2 пришлось схитрить. Можно ли поправить это?
Код:
#include "graphics.h"
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
#include <dos.h>
#include <time.h>

struct point {int x,y,type; double realx,realy;};

int round(double c)
{
	double i,n;
	n=modf(c,&i);
	if (n>=0.5) return ceil(c);
	else return floor(c);
}

int max(int a,int b) {if (a>b) return a; else return b;}
int min(int a,int b) {if (a<b) return a; else return b;}

void dot(int x,int y,int c)
{
	putpixel(x,y,c); putpixel(x+1,y,c); putpixel(x-1,y,c);
	putpixel(x,y+1,c); putpixel(x,y-1,c);
}

point per(point p1, point p2, point p3, point p4)
{
	float k1,k2,b1,b2;
	int x1,y1,x2,y2,x3,y3,x4,y4,wx=0,fx=0;
	x1=p1.x; x2=p2.x; x3=p3.x; x4=p4.x;
	y1=p1.y; y2=p2.y; y3=p3.y; y4=p4.y;
	point b; b.x=0; b.y=0;
	if (x2-x1==0){wx=1;}
	k1=(double)(y2-y1)/(x2-x1); b1=y1-k1*x1;
	if (x4-x3==0){fx=1;}
	else {k2=(double)(y4-y3)/(x4-x3); b2=y3-k2*x3;}

	if (k1!=k2)
	{
		b.realx=(b2-b1)/(k1-k2);
		b.realy=(k1*b.realx+b1);
		b.x=round(b.realx);
		b.y=round(b.realy);
		if (wx==1) {b.x=x1; b.realx=x1; b.y=round(k2*x1+b2); b.realy=k2*x1+b2;}
		if (fx==1) {b.x=x3; b.realx=x3; b.y=round(k1*x3+b1); b.realy=k1*x3+b1;}
		// if point on both lines
		if (b.x>=min(x1,x2) && b.x<=max(x1,x2) &&
			b.y>=min(y1,y2) && b.y<=max(y1,y2) &&
			b.x>=min(x3,x4) && b.x<=max(x3,x4) &&
			b.y>=min(y3,y4) && b.y<=max(y3,y4))
		{
			return b;
		}
		else // else means that point is not visible
		{
			b.x=0; b.y=0; return b;
		}
	}
	else
	return b;
}

void draw(point p[],int n,int color)
{
	int i;
	setcolor(color);
	for (i=0; i<n-1; i++)
			line(p[i].x,p[i].y,p[i+1].x,p[i+1].y);
}

int point_analyz(point w[],int pw,point p)
{
	int i,x1,x2,x3,y1,y2,y3,z,num;
	x3=p.x; y3=p.y;
	for (i=0; i<pw-1; i++)
	{
		x1=w[i].x; x2=w[i+1].x;
		y1=w[i].y; y2=w[i+1].y;
		z=(x3-x1)*(y2-y1)-(y3-y1)*(x2-x1);
		if (z>=0) num++;
	}
	if (num==pw) return 1; else return 0;
//	return 1;
}

int line_analyz(point p1,point p2,point p3,point p4)
{
	int z1=(p3.x-p1.x)*(p2.y-p1.y)-(p3.y-p1.y)*(p2.x-p1.x);
	int z2=(p4.x-p1.x)*(p2.y-p1.y)-(p4.y-p1.y)*(p2.x-p1.x);
//	setcolor(1);
//	line(p1.x,p1.y,p2.x,p2.y); getch();
	if (z1>0 && z2>0) return 1;
	if (z1<0 && z2>0) return 2;
	if (z1>0 && z2<0) return 3;
	if (z1<0 && z2<0) return 4;
}

int onLine(point p, point d1, point d2)
{
	//int z=(p.realx-d1.x)*(d2.y-d1.y)-(p.realy-min(d1.y, d2.y))*(d2.x-d1.x);
	//int z=(p.realx-d1.x)*(d2.y-d1.y)-(p.realy-d1.y)*(d2.x-d1.x);
	if (d1.realx == 0)
		d1.realx = d1.x;
	if (d1.realy == 0)
		d1.realy = d1.y;
	if (d2.realx == 0)
		d2.realx = d2.x;
	if (d2.realy == 0)
		d2.realy = d2.y;
	int z = (p.realx-d1.realx)*(d2.realy-d1.realy) - (p.realy-d1.realy)*(d2.realx-d1.realx);
	if (z==0 && p.x>=min(d1.x,d2.x) && p.x<=max(d1.x,d2.x) && \
				p.y>=min(d1.y,d2.y) && p.y<=max(d1.y,d2.y))
	{
		return 1;
	}
	else return 0;
}

void insert(point p[],int pos,int elem,point d)
{
	int i;
	i=elem-1;
	while (i!=pos-1)
	{
		p[i+1]=p[i];
		i--;
	}
	p[pos]=d;
}

int input(point p[],int s)
{
	int i,n=0;
	for (i=0; i<s; i++)
	{
		if (p[i].type==1) n++;
	}
	if (n==0) return 0; else return 1;
}

int find_elem(point p[],int s,point d)
{
	int i=0,flag=0;
	while (flag==0)
	{
		if (p[i].x==d.x && p[i].y==d.y) flag=1;
		if (i>s) break;
		i++;
	}
	i--;
	return i;
}
Kovy вне форума Ответить с цитированием
Старый 20.02.2011, 12:05   #2
Kovy
Пользователь
 
Регистрация: 23.01.2011
Сообщений: 11
По умолчанию

Код:
void SH_clip(point w[],point f[],int pw,int pf)
{
	int i,j,x1,y1,x2,y2,x3,y3,x4,y4,z1,z2,k=0;
	int s;
	point res[50],nf[50],nw[50],v[50],p;
	point clip[50];
	// in res all points per

	for (i=0; i<pf; i++)
		nf[i]=f[i];
	for (i=0; i<pw; i++)
		nw[i]=w[i];

	for (i=0; i<pf-1; i++)
	{
		for (j=0; j<pw-1; j++)
		{
			s=line_analyz(f[i],f[i+1],w[j],w[j+1]);
			if (s==2)
			{
				p=per(f[i],f[i+1],w[j],w[j+1]);
				if (p.x!=0 && p.y!=0)
				{
					res[k]=p;
					res[k].type=1; k++;
				}
			}
			if (s==3)
			{
				p=per(f[i],f[i+1],w[j],w[j+1]);
				if (p.x!=0 && p.y!=0)
				{
					res[k]=p;
					res[k].type=2; k++;
				}
			}
		}
	}

	int size=0;
	for (i=0; i<k; i++)
	{
		for (j=0; j<pf; j++)
		{
			if (onLine(res[i],nf[j],nf[j+1])==1)
			{
				insert(nf,j+1,pf,res[i]);
				size++;	break;
			}
		}
		pf+=size;
		size=0;
	}

	size=0;
	for (i=0; i<k; i++)
	{
		for (j=0; j<pw-1; j++)
		{
			if (onLine(res[i],nw[j],nw[j+1])==1)
			{
				insert(nw,j+1,pw,res[i]);
				size++;	break;
			}
		}
		pw+=size;
		size=0;
	}
	/*for (i=0; i<pw; i++)
	{
		getch();
		dot(nw[i].x,nw[i].y,4);
	}*/

	k=0;
	i=0;
	while (i < pf)
	{
		if (nf[i].type == 1)
		{
			s = i;
			while (nf[s].type != 2)
			{
				if (s==pf)
					s = 0;
				clip[k++] = nf[s++];
			};
			for (j=0; j<pw; j++)
				if (nw[j].x == nf[s].x && nw[j].y == nf[s].y) break;
			while (nw[j].type != 1)
			{
				if (j==pw)
					j = 0;
				clip[k++] = nw[j++];
			};
		}
		i++;
	};
	clip[k++] = clip[0];
	draw(clip,k,2);
}

void Sh_clip(point e[],point r[], point d[], int pw,int pf, int ph)
{
	getch();
	draw(e,6,3);
	draw(r,5,2);
	draw(d,5,2);
}
Kovy вне форума Ответить с цитированием
Старый 20.02.2011, 12:05   #3
Kovy
Пользователь
 
Регистрация: 23.01.2011
Сообщений: 11
По умолчанию

Код:
void SH_clip(point w[],point f[], point hole[], int pw,int pf, int ph)
{
	int i,j,x1,y1,x2,y2,x3,y3,x4,y4,z1,z2,k=0;
	int s;
	point res[50],nf[50],nw[50],nh[50],v[50],p;
	point clip[50];
	// in res all points per

	for (i=0; i<pf; i++)
		nf[i]=f[i];
	for (i=0; i<pw; i++)
		nw[i]=w[i];
	for (i=0; i<ph; i++)
		nh[i]=hole[i];

	for (i=0; i<pf-1; i++)
	{
		for (j=0; j<pw-1; j++)
		{
			s=line_analyz(f[i],f[i+1],w[j],w[j+1]);
			if (s==2)
			{
				p=per(f[i],f[i+1],w[j],w[j+1]);
				if (p.x!=0 && p.y!=0)
				{
					res[k]=p;
					res[k].type=1; k++;
					continue;
				}
			}
			if (s==3)
			{
				p=per(f[i],f[i+1],w[j],w[j+1]);
				if (p.x!=0 && p.y!=0)
				{
					res[k]=p;
					res[k].type=2; k++;
					continue;
				}
			}
		}
		for (j=0; j<ph-1; j++)
		{
			s=line_analyz(f[i],f[i+1],hole[j],hole[j+1]);
			if (s==2)
			{
				p=per(f[i],f[i+1],hole[j],hole[j+1]);
				if (p.x!=0 && p.y!=0)
				{
					res[k]=p;
					res[k].type=1; k++;
					continue;
				}
			}
			if (s==3)
			{
				p=per(f[i],f[i+1],hole[j],hole[j+1]);
				if (p.x!=0 && p.y!=0)
				{
					res[k]=p;
					res[k].type=2; k++;
					continue;
				}
			}
		}
	}

	int size=0;
	for (i=0; i<k; i++)
	{
		for (j=0; j<pf-1; j++)
		{
			if (onLine(res[i],nf[j],nf[j+1])==1)
			{
				insert(nf,j+1,pf,res[i]);
				size++;	break;
			}
		}
		pf+=size;
		size=0;
	}

	size=0;
	for (i=0; i<k; i++)
	{
		for (j=0; j<pw-1; j++)
		{
			if (onLine(res[i],nw[j],nw[j+1])==1)
			{
				insert(nw,j+1,pw,res[i]);
				size++;	break;
			}
		}
		pw+=size;
		size=0;
	}

	size=0;
	for (i=0; i<k; i++)
	{
		for (j=0; j<ph-1; j++)
		{
			if (onLine(res[i],nh[j],nh[j+1])==1)
			{
				insert(nh,j+1,ph,res[i]);
				size++;	break;
			}
		}
		ph+=size;
		size=0;
	}
	for (i=0; i<pf; i++)
	{
		//getch();
		//dot(nf[i].x,nf[i].y,2);
	}

	k=0;
	i=0;
	s=0;

	getch();
	//проходим все узлы
	while (s < pf)
	{
		//если вышли за границы - возвращаемся
		if (i == pf-1) i = 0;
		//если входим
		if (nf[i].type == 1)
		{
			//вставляем узел в новый многоугольник
			clip[k++] = nf[i++];
			s++;
			//и ищем следующую точку входа/выхода
			while (nf[i].type != 2 && nf[i].type != 1)
			{
				if (i==pf-1)
					i = 0;
				//Если нету - вставляем текущую вершину фигуры
				clip[k++] = nf[i++];
				s++;
			}; //вышли - нашли точку входа/выхода

			//теперь ищем эту точку в окне
			for (j=0; j<pw; j++)
				if (nw[j].x == nf[i].x && nw[j].y == nf[i].y) break;

			//Если не нашли - то эта точка в дырке
			if (j==pw)
			{
				//Начнем обходить дырку

				//Ищем точку пересечения
				for (j=0; j<ph; j++)
					if (nh[j].x == nf[i].x && nh[j].y == nf[i].y) break;


				//Огибаем дырку
				while (nh[j].type != 2)
				{
					if (j==0)
						j = ph-1;
					clip[k++] = nh[j--];
				};

				//Вставляем последний дырочный элемент
				//clip[k++] = nh[j];

				//Ищем следующий узел фигуры
				while (!(nh[j].x == nf[i].x && nh[j].y == nf[i].y))
				{
					i++;
					s++;
				}

				//вставляем узел в новый многоугольник
				clip[k++] = nf[i++];
				s++;
				//и ищем следующую точку входа/выхода
				while (nf[i].type != 2 && nf[i].type != 1)
				{
					if (i==pf-1)
						i = 0;
					//Если нету - вставляем текущую вершину фигуры
					clip[k++] = nf[i++];
					s++;
				}; //вышли - нашли точку входа/выхода

				while (nf[i].type != 2)
				{
					if (i==pf-1)
						i = 0;
					clip[k++] = nf[i++];
					s++;
				};
				for (j=0; j<pw; j++)
					if (nw[j].x == nf[i].x && nw[j].y == nf[i].y) break;

			}

			//Огибаем окно
			while (nw[j].type != 1)
			{
				if (j==pw-1)
					j = 0;
				clip[k++] = nw[j++];
			};
		}
		s++;
		i++;
	};
	clip[k++] = clip[0];
	draw(clip,k,2);
}
Kovy вне форума Ответить с цитированием
Старый 20.02.2011, 12:06   #4
Kovy
Пользователь
 
Регистрация: 23.01.2011
Сообщений: 11
По умолчанию

Код:
int main()
{
	point s1,e1,s2,e2,p;
	int gdriver=DETECT,gmode;
	initgraph(&gdriver,&gmode,"c:\\bc31\\bgi\\");
	/*int wx1,wx2,wx3,wx4,wx5,wx6,wy1,wy2,wy3,wy4,wy5,wy6;
	int fx1,fx2,fx3,fx4,fx5,fy1,fy2,fy3,fy4,fy5;
	int hx1,hx2,hx3,hx4,hx5,hy1,hy2,hy3,hy4,hy5;
	*/
	while(1)
	{
		printf("1.Otdelno  ");
		printf("2.Vnutri  ");
		printf("3.Peresechenie  ");
		printf("4.Vnutri obratno  ");
		printf("0.Vyhod    ");
		int k=-1;
		printf("Pokazat': ");
		scanf("%d",&k);
		switch(k)
		{
			case 1:
			{
			cleardevice();
			point w[6]={{300,300},{350,170},{420,130},{500,170},{460,300},{300,300}};
			point f[5]={{160,50},{350,50},{280,280},{150,280},{160,50}};
			point hole[5] = {{200,100},{250,180},{270,240},{200,250},{200,100}};
			draw(w,6,4);
			draw(f,5,7);
			draw(hole,5,7);
			SH_clip(f,w,hole,5,6,5);
			system("pause");
			cleardevice();
			} break;
			case 2:
			{
			cleardevice();
			point w[6]={{100,70},{200,20},{360,40},{300,300},{150,300},{100,70}};
			point f[5]={{160,50},{350,50},{280,280},{150,280},{160,50}};
			point hole[5] = {{200,100},{250,180},{270,240},{200,250},{200,100}};
			draw(w,6,4);
			draw(f,5,7);
			draw(hole,5,7);
			getch();
			draw(w,6,4);
			draw(f,5,2);
			draw(hole,5,2);
			//SH_clip(f,w,hole,5,6,4);
			system("pause");
			cleardevice();
			} break;
			case 3:
			{
			cleardevice();
			point w[6]={{100,170},{200,130},{350,170},{300,300},{150,300},{100,170}};
			point f[5]={{160,50},{350,50},{280,280},{150,280},{160,50}};
			point hole[5] = {{200,100},{250,180},{270,240},{200,250},{200,100}};
			draw(w,6,4);
			draw(f,5,7);
			draw(hole,5,7);
			SH_clip(f,w,hole,5,6,5);
			system("pause");
			cleardevice();
			} break;
			case 4:
			{
			cleardevice();
			point w[6]={{100,170},{200,130},{290,190},{270,300},{150,300},{100,170}};
			point f[5]={{90,50},{350,50},{280,320},{80,320},{90,50}};
			point hole[5] = {{200,100},{250,180},{270,240},{200,250},{200,100}};
			draw(w,6,4);
			draw(f,5,7);
			draw(hole,5,7);
			SH_clip(f,w,hole,5,6,5);
			system("pause");
			cleardevice();
			} break;
			case 0: exit(0) ; break;
			}
			}

	//dot(200, 50, 3);
	//SH_clip(w,f,6,5);

	getch();

	closegraph();
}
Kovy вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при компиляции vovchok777 Общие вопросы C/C++ 1 26.12.2010 16:07
ошибка при исполнении (что то при установке компонентов) designer999 Компоненты Delphi 0 18.10.2010 22:03
о параллельных вычислениях motorway PHP 4 20.09.2009 18:22
Ошибка при компиляции MasterofCDM Общие вопросы Delphi 2 11.11.2008 09:35
Ошибка при отключении ОС GREK Операционные системы общие вопросы 1 24.09.2008 16:50