如何将一个矩形划分成四个三角形区域?

song_alone 2009-02-17 02:06:18
如题, 如何将一个矩形划分成对角相连, 上下左右四个三角形区域?
当我在这个矩形上单击鼠标的时候, 能过判断当前点是在哪个三角形区域!!
感谢各位给我建议.
...全文
660 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
fengloveyun 2009-10-19
  • 打赏
  • 举报
回复
七楼的算法不对,你这个算法只适合 正方形,矩形不适合。
fengloveyun 2009-10-19
  • 打赏
  • 举报
回复
七楼的算法不对,你这个算法只适合 正方形,矩形不适合。
fengloveyun 2009-10-19
  • 打赏
  • 举报
回复
七楼的算法不对,你这个算法只适合 正方形,矩形不适合。
eblis88 2009-02-21
  • 打赏
  • 举报
回复
不规则矩形
[x' y']=T[x y] 坐标变换后,再用我7楼的方法咯。就这样吧。
rover___ 2009-02-20
  • 打赏
  • 举报
回复
有那么复杂吗?


矩形应该可以是任意矩形,不必须是与坐标轴平行的。
Show_Mike 2009-02-20
  • 打赏
  • 举报
回复
从所提的问题来看,采用计算几何的方法,例如6楼的方法,来计算是可行的;但是,如果从一般的图像,图形处理来看,采用MFC的point in a region的测试也方便。
eblis88 2009-02-20
  • 打赏
  • 举报
回复
中间有一行打错了。

比较大小的第一行,x打成y了。楼主小心
eblis88 2009-02-20
  • 打赏
  • 举报
回复

#include <math.h>
// 枚举方位
enum DIVIDED_POSITION
{
POSITION_NONE=0,
POSITION_LEFT,
POSITION_RIGHT,
POSITION_TOP,
POSITION_BOTTOM
}
// 函数体
DIVIDED_POSITION RectDevide(float fRectLeftX,float fRectBottomY,float fRectRightX,float fRectTopY,float fMouseX,float fMouseY)
{
//求4个绝对值
float fLeftDistanceX=abs(fRectLeftX-fMouseX);
float fRightDistanceX=abs(fRectRightX-fMouseX);
float fTopDistanceY=abs(fRectTopY-fMouseY);
float fBottomDistanceY=abs(fRectBottomY-fMouseY);
//比较两两大小
float fMaxHori=(fLeftDistanceX>fRightDistanceY)?fLeftDistanceX:fRightDistanceX;
float fMaxVerti=(fTopDistanceY>fBottomDistanceY)?fTopDistanceY:fBottomDistanceY;
//继续比较大小
switch ((fMaxHori>fMaxVerti)?fMaxHori:fMaxVerti)
{
case fLeftDistanceX:
return POSITION_LEFT; // 左
case fRightDistanceX:
return POSITION_RIGHT; // 右
case fTopDistanceY:
return POSITION_TOP; // 上
case fBottomDistanceY:
return POSITION_BOTTOM;
default:
return POSITION_NONE;
}
}




楼上的代码牛头不对马嘴
pioneer_public 2009-02-19
  • 打赏
  • 举报
回复

//struct CVSNestPoint
{
double m_dx;
double m_dy;
};


// 判断一个点是否在三角形中,如果点的坐标代入到三个边的ABC中结果同为正或同为负或有一个为0,都认为是在三角形中
BOOL CVSNestHelper::IsPtInTriangle(CVSNestPoint *pPtOne,CVSNestPoint *pPtTwo,CVSNestPoint *pPtThr,CVSNestPoint *pPtFour)
{
BOOL bReturn = false;
//求出三角形三边的ABC的值 Ax + By + C = 0
double A1,A2,A3;
double B1,B2,B3;
double C1,C2,C3;

//A1,B1,C1是第1点与第2点的直线ABC,A2,B2,C2是第2点与第3点的直线ABC,A3,B3,C3是第3点与第1点的直线ABC
A1 = pPtTwo->m_dY - pPtOne->m_dY;
B1 = pPtOne->m_dX - pPtTwo->m_dX;
C1 = pPtTwo->m_dX * pPtOne->m_dY - pPtOne->m_dX * pPtTwo->m_dY;

A2 = pPtThr->m_dY - pPtTwo->m_dY;
B2 = pPtTwo->m_dX - pPtThr->m_dX;
C2 = pPtThr->m_dX * pPtTwo->m_dY - pPtTwo->m_dX * pPtThr->m_dY;

A3 = pPtOne->m_dY - pPtThr->m_dY;
B3 = pPtThr->m_dX - pPtOne->m_dX;
C3 = pPtOne->m_dX * pPtThr->m_dY - pPtThr->m_dX * pPtOne->m_dY;

double x1,x2,x3;
x1 = A1 * pPtFour->m_dX + B1 * pPtFour->m_dY + C1;
x2 = A2 * pPtFour->m_dX + B2 * pPtFour->m_dY + C2;
x3 = A3 * pPtFour->m_dX + B3 * pPtFour->m_dY + C3;

if(((x1 > ESP) && (x2 > ESP) && (x3 > ESP)) || ((x1 < -ESP) && (x2 < -ESP) && (x3 < -ESP)))
{
bReturn = true;
return bReturn;
}

//如果第四点代入系数方程为0
if(fabs(x1) <= ESP)
{
//如果第4点的在两点之间,则在三角形上,否则在外
if(((pPtOne->m_dX - pPtFour->m_dX) * (pPtTwo->m_dX - pPtFour->m_dX) <=ESP) &&
((pPtOne->m_dY - pPtFour->m_dY) * (pPtTwo->m_dY - pPtFour->m_dY) <=ESP))
{
bReturn = true;
return bReturn;
}
}

if( fabs(x2) <= ESP )
{
//如果第4点的在两点之间,则在三角形上,否则在外
if(((pPtThr->m_dX - pPtFour->m_dX) * (pPtTwo->m_dX - pPtFour->m_dX) <=ESP) &&
((pPtThr->m_dY - pPtFour->m_dY) * (pPtTwo->m_dY - pPtFour->m_dY) <=ESP))
{
bReturn = true;
return bReturn;
}
}

if( fabs(x3) <= ESP )
{
//如果第4点的在两点之间,则在三角形上,否则在外
if(((pPtThr->m_dX - pPtFour->m_dX) * (pPtOne->m_dX - pPtFour->m_dX) <= ESP) &&
((pPtThr->m_dY - pPtFour->m_dY) * (pPtOne->m_dY - pPtFour->m_dY) <= ESP))
{
bReturn = true;
return bReturn;
}
}

return bReturn;
}

闪破风浪 2009-02-17
  • 打赏
  • 举报
回复
两点画直线~
cnzdgs 2009-02-17
  • 打赏
  • 举报
回复
画线只要MoveTo到其中一个顶点,再LineTo到其相对的顶点即可,然后再画两一对顶点之间的连线。
判断点属于哪个区域时,可以计算从矩形中点到该点的角度,与中点到4个顶点的角度来比较。
fandh 2009-02-17
  • 打赏
  • 举报
回复
分区,就是对角画线,不知道你要怎么分?
求鼠标在那个区,有以下几个步骤:
1、判断点是否在矩形内,如果不在,退出; 到下一步;
2、先求出中心点center;
3、求出中心点与你鼠标点pt的角度[0--360),这样,根据角度判断在那个区
song_alone 2009-02-17
  • 打赏
  • 举报
回复
可不可以把这个翻译成C++哦
eblis88 2009-02-17
  • 打赏
  • 举报
回复
四个角
(0,0) (0,1)
(1,0) (1,1)
鼠标点后的坐标
(x,y)
计算
min(|x|,|x-1|,|y|,|y-1|)
便可找到对应的属于哪个三角形区域
min=
|x| top
|x-1| down
|y| left
|y-1| right

19,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧