给定一组直线,求其在指定区间内所切割出的区域
解:切割区域 = 给定区间内的交点数量 + 直线数量 + 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;
}