#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
#include "stdlib.h"
#include "stdio.h"
#include "iostream.h"
//函数
float y_1 = 0;
float y_2 = 0;
float y_3 = 0;
float y_4 = 0;
//直线的斜率
float k_1 = 0;
float k_2 = 0;
float k_3 = 0;
float k_4 = 0;
float b_1 = 0;
float b_2 = 0;
float b_3 = 0;
float b_4 = 0;
//是否关于x 轴 或 y 轴垂直
BOOL tmp_1 = FALSE;
BOOL tmp_2 = FALSE;
BOOL tmp_3 = FALSE;
BOOL tmp_4 = FALSE;
int sort_x[4];
int sort_y[4];
void SetZero(int *arr, int leng)
{
for (int i=0; i<leng; i++)
{
arr[i] = 0;
}
}
//分别计算斜率 与 对应的b 以及x y 的从大到小的排序
void Fun(CvPoint *pt)
{
int i = 0;
int j = 0;
int tmp_x = 0;
int tmp_y = 0;
int index_x = 0;
int index_y = 0;
int temp_x[4];
int temp_y[4];
int max_valuse = 6556;
SetZero(sort_x, 4);
SetZero(sort_y, 4);
SetZero(temp_x, 4);
SetZero(temp_y, 4);
//计算y_1的公式 经过点pt[0] 与点 pt[1];
//两点式的x1 不能等于 x2 ; y1 不等于y2;这里不需要考虑y的取值,
//在调线圈时要考虑 两个点不能重合
//
if (pt[0].x == pt[1].x)
{
y_1 = (float)pt[0].x;
tmp_1 = TRUE;
}else{
k_1 = (float)(pt[1].y - pt[0].y) /(pt[1].x - pt[0].x);
b_1 = pt[0].y - (k_1 * pt[0].x);
}
//计算y_2 的斜率 与 b 经过点pt[2], pt[1];
if (pt[2].y == pt[1].y)
{
y_2 = (float)pt[2].y;
tmp_2 = TRUE;
}else{
k_2 = (float)((pt[2].y - pt[1].y) / (pt[2].x - pt[1].x));
b_2 = pt[1].y - (k_2 * pt[1].x);
}
//计算y_3 的斜率 与 b 经过点pt[3], pt[2];
//这两点的x 值不会相同,y值有可能相同
if (pt[3].x == pt[2].x)
{
y_3 = (float)pt[2].x;
tmp_3 = TRUE;
}else{
k_3 = (float)(pt[2].y - pt[3].y) / (pt[2].x - pt[3].x);
b_3 = pt[3].y - (k_3 * pt[3].x);
}
//计算y_4 的斜率 与 b 经过点pt[0], pt[3];
//这两点的x 值不会相同,y值有可能相同
if (pt[0].y == pt[3].y)
{
y_4 = (float)pt[0].y;
tmp_4 = TRUE;
}else{
k_4 = (float)(pt[0].y - pt[3].y) / (pt[0].x - pt[3].x);
b_4 = pt[3].y - (k_4 * pt[3].x);
}
//选择排序 对四个点的x值 y 值从 小到大排序 点的序号保存到sort 数组里。
for (i=0; i<4; i++)
{
tmp_x = max_valuse;
tmp_y = max_valuse;
for (j=0; j<4; j++)
{
if (pt[j].x < tmp_x && (0 == temp_x[j]))
{
tmp_x = pt[j].x;
index_x = j;
}
if (pt[j].y < tmp_y && (0 == temp_y[j]))
{
tmp_y = pt[j].y;
index_y = j;
}
}
sort_x[i] = index_x;
temp_x[index_x] = 4;
sort_y[i] = index_y;
temp_y[index_y] = 4;
}
}
BOOL IsFill(int x, int y, CvPoint* pt)
{
float tmp_valuse = 0;
//不在方形区域内
if (pt[sort_x[0]].x > x || x > pt[sort_x[3]].x || pt[sort_y[0]].y > y || pt[sort_y[3]].y < y)
{
return FALSE;
}
//判断是否在y_1 的右边
if (tmp_1 && y_1 > x)
{
return FALSE;
}
if (!tmp_1)
{
tmp_valuse =(y - b_1)/k_1;
if (x < tmp_valuse)
{
return FALSE;
}
}
//判断是否在y_3的左边;
if (tmp_3 && y_3 <x)
{
return FALSE;
}
if (!tmp_3)
{
tmp_valuse = (y - b_3) / k_3;
if (tmp_valuse < x)
{
return FALSE;
}
}
//判断是否在y_2的上边;
if (tmp_2 && y_2 > y)
{
return FALSE;
}
//printf("x= %d y= %d %d %d %d %d\n",\
// x,y,pt[sort_x[0]].x,pt[sort_x[3]].x,pt[sort_y[0]].y,pt[sort_y[3]].y);
if (!tmp_2)
{
tmp_valuse = b_2 + k_2 * x;
if (tmp_valuse > y)
{
return FALSE;
}
}
//判断是否在y_4的下边;
if (tmp_4 && y_4 < y)
{
return FALSE;
}
if (!tmp_4)
{
tmp_valuse = b_4 + k_4 * x;
if (tmp_valuse < y)
{
return FALSE;
}
}
return TRUE;
}
void main()
{
CvPoint pt[4];
pt[0].x = 2;
pt[0].y = 4;
pt[1].x = 1;
pt[1].y = 2;
pt[2].x = 4;
pt[2].y = 1;
pt[3].x = 7;
pt[3].y = 6;
pt[0].x = 1;
pt[0].y = 6;
pt[1].x = 1;
pt[1].y = 2;
pt[2].x = 7;
pt[2].y = 2;
pt[3].x = 7;
pt[3].y = 6;
int sum = 0;
Fun(pt);
int data[7][7];
for (int a=0; a<7; a++)
{
for (int b=0; b<7; b++)
{
data[a][b] = 0;
}
}
data[0][2] = 1;
data[2][3] = 1;
data[3][4] = 8;
data[1][5] = 8;
for (int i=pt[sort_x[0]].x; i<pt[sort_x[3]].x; i++)
{
for (int j=pt[sort_y[0]].y; j<pt[sort_y[3]].y; j++)
{
if (IsFill(i,j,pt) && 0 != data[i][j])
{
cout<<"\nx= "<<i<<" y= "<<j<<endl;
sum++;
}
}
}
cout<<"min_x= "<<pt[sort_x[0]].x<<" max_x= "<<pt[sort_x[3]].x;
cout<<"\nmin_y= "<<pt[sort_y[0]].y<<" max_x= "<<pt[sort_y[3]].y;
cout<<"\nsum = "<<sum<<endl;
}
评论0