编程之美1.7-光影切割问题

给定一组直线,求其在指定区间内所切割出的区域

解:切割区域 = 给定区间内的交点数量 + 直线数量 + 1

1.首先求出每条直线的表达式:y=kx+b

2.写一个能求两条直线间交点的函数

3.分别求出给定组直线间的交点

4.排序,若交点在指定区间内,则该交点满足条件

5.切割区域 = 给定区间内的交点数量 + 直线数量 + 1

数据结构:

class Point :用于存放点

class Line :存放直线,由两个点组成,并能根据给定的点求出斜率k和家数b

vector<Line> XXX :存放直线组

vector<Point> XXX :存放点组

set<Point> XXX:自动排序

函数:

void GetLine(void) :将给定的直线存入vector<Line>中

void ShowLine(vector<Line>) :显示该vector中的直线

void ShowPoint(vector<Point>) :显示该vector中的点

Point GetPointByLine(Line l1,Line l2) :求两直线间的交点

void GetPoint(vector<Line> vLine,vector<Point>& vPoint):求vector<Line>中各直线的交点,将交点存入vector<Point>中

int NumofPoint(vector<Point> vPoint,int x,int y):横坐标在[x,y]区间内的点的数量

int NumofArea(vector<Point> vPoint,vector<Line> vLine,int x,int y):本问题的解

代码:

// test.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <vector>
#include <iostream>
#include <fstream>
#include <set>

using namespace std;

class Point
{
public:
	double x,y;
	Point()
	{x=0;y=0;}
	Point(double a,double b)
	{x=a;y=b;}
	void operator= (Point c)
	{
		x = c.x;
		y = c.y;
	}
	void SetPoint(double a,double b)
	{
		x = a;
		y = b;
	}
};
class Line
{
public:
	Point beginPoint,endPoint;
	double k,b;
	Line(Point a,Point b)
	{
		beginPoint = a;
		endPoint = b;
		CalLine(a,b);
	}
	Line(int a,int b,int c,int d)
	{
		beginPoint.x = a ; beginPoint.y = b;
		endPoint.x = c ; endPoint.y = d;
		CalLine(beginPoint,endPoint);
	}
	Line(void)
	{
		beginPoint.x=beginPoint.y=endPoint.x=endPoint.y=0;
	}
	void CalLine(Point beginPoint,Point endPoint)
	{
		k = (endPoint.y - beginPoint.y) / (endPoint.x - beginPoint.x);
		b = endPoint.y - k*endPoint.x ;
	}
};
vector<Point> vPointArr;
vector<Line> vLineArr;
void GetLine(void)
{
	int a,b,c,d;
	ifstream fin;
	fin.open("test.txt");
	while(fin>>a>>b>>c>>d)
	{
		Line* temp = new Line(a,b,c,d);
		vLineArr.push_back(*temp);
	}	
}
void ShowLine(vector<Line> vLineArr)
{
	vector<Line>::iterator iter = vLineArr.begin();
	for(;iter != vLineArr.end(); ++iter)
	{
		cout<<iter->beginPoint.x<<","<<iter->beginPoint.y<<"   ";
		cout<<iter->endPoint.x<<","<<iter->endPoint.y<<"   ";
		cout<<"Y="<<iter->k<<"*X+"<<iter->b<<endl;
	}
}
void ShowPoint(vector<Point> vPointArr)
{
	vector<Point>::iterator iter = vPointArr.begin();
	for(;iter != vPointArr.end(); ++iter)
	{
		cout<<"("<<iter->x<<","<<iter->y<<")"<<" ";
	}
	cout<<endl;
}
Point GetPointByLine(Line l1,Line l2)
{
	Point tempPoint;
	double x,y;
	if(l1.k == l2.k)
	{
		tempPoint.SetPoint(-999,-999);
	}
	else
	{
		x = (l2.b - l1.b) / (l1.k - l2.k);
		y = l1.k * x + l1.b;
		tempPoint.SetPoint(x,y);
	}
	return tempPoint;
}
void GetPoint(vector<Line> vLine,vector<Point>& vPoint)
{
	for(vector<Line>::iterator iter= vLine.begin() ; iter != vLine.end() ; ++iter)
	{
		for(vector<Line>::iterator iter2= iter+1 ; iter2 != vLine.end() ; ++iter2)
		{
			Point temp = GetPointByLine(*iter,*iter2);
			vPoint.push_back(temp);
		}
	}
};
int NumofPoint(vector<Point> vPoint,int x,int y)
{
	int i = 0;
	set<double> xPos;
	for(vector<Point>::iterator iter = vPointArr.begin() ; iter != vPointArr.end() ; ++iter)
	{
		double temp = iter->x;
		xPos.insert(temp);
	}
	cout<<"xPos of Point is:";
	for(set<double>::iterator iter = xPos.begin(); iter != xPos.end() ; ++iter)
		cout<<(*iter)<<" ";

	
	for(set<double>::iterator iter = xPos.begin(); iter != xPos.end() ; ++iter)
		if((*iter) <= y && (*iter) >=x )
			++i;
	return i;
}
int NumofArea(vector<Point> vPoint,vector<Line> vLine,int x,int y)
{
	int i = NumofPoint(vPointArr,x,y);
	return i+vLine.size()+1;
}
int _tmain(int argc, _TCHAR* argv[])
{
	GetLine();
	
	cout<<"Line:"<<endl;
	ShowLine(vLineArr);
	GetPoint(vLineArr,vPointArr);
	cout<<"Point:"<<endl;
	ShowPoint(vPointArr);
	
	cout<<endl<<"Num of Aera:"<<NumofArea(vPointArr,vLineArr,-100,100);
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值