c++如何用画点函数画出一个填充了颜色的三角形
现在已经有三角形点的三个顶点点坐标和一个画点函数drawpoint(intx,inty,intcolor)...
现在已经有三角形点的三个顶点点坐标和一个画点函数drawpoint(int x,int y,int color)
展开
2个回答
展开全部
这个题的关键,是判断一个点,落在三角形以内,还是落在三角形以外。
下面调用手头现成的判断一个点,落在凸多边形以内,还是落在凸多边形以外的程序。
int pnpoly(int npol, float *xp, float *yp, float x, float y);
程序步骤:
输入三角形 三个顶点点坐标 xi,yi, 逆时针次序 (保证 叉乘积 为正,为三角形内)
输入填充点的间距 dx,dy
计算 Bounding Box
在 Bounding Box 范围内 找点,落在三角形以内的 调用 你给的drawpoint(int x,int y,int color)
==========================================
#include <stdio.h>
#include <math.h>
int pnpoly(int npol, float *xp, float *yp, float x, float y)
{
int i, j, c = 0;
for (i = 0, j = npol-1; i < npol; j = i++) {
if ((((yp[i]<=y) && (y<yp[j])) ||
((yp[j]<=y) && (y<yp[i]))) &&
(x < (xp[j] - xp[i]) * (y - yp[i]) / (yp[j] - yp[i]) + xp[i]))
c = !c;
}
return c;
}
int main()
{
float xp[3], yp[3];
float x_max,x_min,y_max,y_min;
float dx,dy;
int i,j;
float x,y;
int color = 5;
for (i=1;i<=3;i++)
{
printf("input x%d y%d:\n",i,i);
scanf("%f %f",&xp[i-1],&yp[i-1]);
};
x_max = xp[0]; x_min = xp[0];
y_max = yp[0]; y_min = yp[0];
for (i=1;i<3;i++){
if (xp[i] > x_max ) x_max = xp[i];
if (xp[i] < x_min ) x_min = xp[i];
if (yp[i] > y_max ) y_max = yp[i];
if (yp[i] < y_min ) y_min = yp[i];
}
printf("input dx dy\n");
scanf("%f %f",&dx,&dy);
for (y=y_min; y<=y_max;y=y+dy) {
for (x=x_min;x<=x_max;x=x+dx) {
if ( pnpoly(3, &xp[0], &yp[0], x, y) == 1)
drawpoint( (int) x, (int) y, color );
// printf("%f %f\n",x,y);
}
}
return 0;
}
下面调用手头现成的判断一个点,落在凸多边形以内,还是落在凸多边形以外的程序。
int pnpoly(int npol, float *xp, float *yp, float x, float y);
程序步骤:
输入三角形 三个顶点点坐标 xi,yi, 逆时针次序 (保证 叉乘积 为正,为三角形内)
输入填充点的间距 dx,dy
计算 Bounding Box
在 Bounding Box 范围内 找点,落在三角形以内的 调用 你给的drawpoint(int x,int y,int color)
==========================================
#include <stdio.h>
#include <math.h>
int pnpoly(int npol, float *xp, float *yp, float x, float y)
{
int i, j, c = 0;
for (i = 0, j = npol-1; i < npol; j = i++) {
if ((((yp[i]<=y) && (y<yp[j])) ||
((yp[j]<=y) && (y<yp[i]))) &&
(x < (xp[j] - xp[i]) * (y - yp[i]) / (yp[j] - yp[i]) + xp[i]))
c = !c;
}
return c;
}
int main()
{
float xp[3], yp[3];
float x_max,x_min,y_max,y_min;
float dx,dy;
int i,j;
float x,y;
int color = 5;
for (i=1;i<=3;i++)
{
printf("input x%d y%d:\n",i,i);
scanf("%f %f",&xp[i-1],&yp[i-1]);
};
x_max = xp[0]; x_min = xp[0];
y_max = yp[0]; y_min = yp[0];
for (i=1;i<3;i++){
if (xp[i] > x_max ) x_max = xp[i];
if (xp[i] < x_min ) x_min = xp[i];
if (yp[i] > y_max ) y_max = yp[i];
if (yp[i] < y_min ) y_min = yp[i];
}
printf("input dx dy\n");
scanf("%f %f",&dx,&dy);
for (y=y_min; y<=y_max;y=y+dy) {
for (x=x_min;x<=x_max;x=x+dx) {
if ( pnpoly(3, &xp[0], &yp[0], x, y) == 1)
drawpoint( (int) x, (int) y, color );
// printf("%f %f\n",x,y);
}
}
return 0;
}
展开全部
如果每个点都要计算是否包含在三角形内,那么程序有可能运行时间过长。
普通的做法是:
-绘制三角形外框
-计算出三角形中的一点,比如中心点,或重心之类的,要位于三角形之内
-以此点为种子进行填充
填充的规则是:
记录所有种子:
种子所在列上方三角形外框的color点至种子所在列下方三角形外框的color点之间所有点
对这些种子逐一进行如下处理:
将种子所在行左侧三角形外框的color点至种子所在行右侧三角形外框的color点之间的点用
drawpoint函数画点填充。
以上填充是对应凸多边形的方法,如果是凹多边形会稍复杂些。
普通的做法是:
-绘制三角形外框
-计算出三角形中的一点,比如中心点,或重心之类的,要位于三角形之内
-以此点为种子进行填充
填充的规则是:
记录所有种子:
种子所在列上方三角形外框的color点至种子所在列下方三角形外框的color点之间所有点
对这些种子逐一进行如下处理:
将种子所在行左侧三角形外框的color点至种子所在行右侧三角形外框的color点之间的点用
drawpoint函数画点填充。
以上填充是对应凸多边形的方法,如果是凹多边形会稍复杂些。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询