c++蛮力法解决凸包可视化

#include<iostream>
#include <fstream>
#include<graphics.h>
#include <conio.h>
using namespace std;


#define Max 10//十个点的凸包问题
#define maxn 10000
#define time 3//放大倍数

typedef struct {
    
    
	int a;
	int b;
}point;
/*(0,0) (-30,-40) (-30,-50) (-10,-60) (50,-60) (70,-50) (90,-20) (90,10) (80,20) (60,30)*/

void draw_point(point x[]);
void draw_line(int a, int b, int c, int d);
void judge(point x[]);

int main() {
    
    
	point x[Max];

		ifstream in("e://凸包点集.txt");//将txt放于e:盘中读取
		cout << "从txt中读取点坐标如下:"<<endl;
		for (int i = 0; i < 10; i++)
		{
    
    
			in >> x[i].a;
			in >> x[i].b;
		}
		for (int i = 0; i < 10; i++)
		{
    
    
			cout << i + 1 << ":" << "(" << x[i].a << "," << x[i].b << ")" << endl;
		}
		cout << endl << endl;
		in.close();
		cout << "存储的数据如下:" << endl;
		draw_point(x);
		judge(x);
		getchar();
		return 0;
}

void judge(point x[]) {
    
    
	int i, j, a, b, c, n, num1 = 0, num2 = 0;
	int flag;
	for (i = 0; i < Max; i++)
	{
    
    
		for (j = i + 1; j < Max; j++)
		{
    
    
			b = x[i].a-x[j].a;
			a = x[j].b- x[i].b;
			c = x[i].a*x[j].b - x[j].a*x[i].b;
			
			for (n = 0; n < Max; n++)
			{
    
    
				if (n != i && n != j)
				{
    
    
					flag = x[n].a*a + x[n].b*b;
					if (flag< c)
						num1++;
					else if (flag> c)
						num2++;
					else {
    
    
						num1++;
						num2++;
					}
						;
				}
			}
			if (num1 == 8||num2==8) 
			{
    
    
				cout << "如下两点是极边:"  << "(" << x[i].a << "," << x[i].b << ")" << "(" << x[j].a << "," << x[j].b << ")" << endl;
				draw_line(x[i].a, x[i].b, x[j].a, x[j].b);
			}
			num1 = num2 = 0;
		}
	}

}

void draw_point(point x[]) {
    
    
	initgraph(640, 480, SHOWCONSOLE);
	setorigin(320,240);//设置原点
	int a, b;
	for (int i = 0; i < Max; i++) {
    
    
		a = x[i].a*time;
		b = x[i].b*time;
		fillcircle(a, b, 4);

	}
}

void draw_line(int a, int b, int c, int d)
{
    
    
	line(a*time, b*time, c*time, d*time);
}



在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43318654/article/details/105259944