在华大基因库的“graphics. h”头文件中有一个函数pieslice,其语法为:
#include <graphics.h>
void pieslice(int x, int y, int stangle, int endangle, int radius);
[x,y是圆心,stangle和endangle分别是起始角和结束角]
我们可以在C/C++中不使用BGI库的这个内置函数来制作切片吗?请帮助。尝试在直线和中点圆生成算法的帮助下制作它。
到目前为止的代码:
#include<stdio.h>
#include<graphics.h>
static const double PI =3.141592
int main()
{
int gd=DETECT,gm;
initgraph(&gd,&gm,NULL);
int xc,yc,r,st_angle,ed_angle,k;
printf("Enter the centers of pieslice:\n");
scanf("%d %d",&xc,&yc);
printf("Enter the radius:\n");
scanf("%d",&r);
printf("Enter the starting angle:\n");
scanf("%d",&st_angle);
printf("Enter the end angle:\n");
scanf("%d",&ed_angle);
for(k=st_angle; k<=ed_angle;k++)
{
double radians =(PI /180.0) * k;
int X = xc+ cos(radians) * r;
int Y = yc+ sin(radians) * r;
putpixel(x,y,WHITE);
delay(5000);
}
void wait_for_char()
{
//Wait for a key press
int in = 0;
while (in == 0) {
in = getchar();
}
}
getch();
}
我能够做的计算部分,我使用的参数方程的圆,但无法生成的数字使用graphics.h
功能。一些帮助会很好。提前感谢你。
在运行此程序时,我收到此错误:
[xcb] Unknown sequence number while processing queue
[xcb] Most likely this is a multi-threaded client and XInitThreads has not been called
[xcb] Aborting, sorry about that.
a.out: ../../src/xcb_io.c:274: poll_for_event: Assertion `!xcb_xlib_threads_sequence_lost' failed.
[xcb] Unknown sequence number while processing queue
[xcb] Most likely this is a multi-threaded client and XInitThreads has not been called
[xcb] Aborting, sorry about that.
a.out: ../../src/xcb_io.c:274: poll_for_event: Assertion `!xcb_xlib_threads_sequence_lost' failed.
Aborted (core dumped)
1条答案
按热度按时间2uluyalo1#
为什么不用载体呢
因此,半径为
r
的(0,0)
中心饼由下式确定:CW/CCW通过计算3D叉积并检查结果z坐标…的符号来确定。
因此处理圆形外切正方形中的所有像素,并渲染符合所有3个条件的所有像素。
就像这样:
但是我没有使用BGI,所以只需要将
Pixels[sy][sx]=c;
更改为putpixel(sx,sy,c);
,并删除sx,sy
的过时范围检查ifs。同时删除分辨率xs,ys
和Pixels
变量。这里预览(
xs2,ys2
是我的屏幕中间):请注意,我有32位的RGB颜色,而不是你的索引8位的和Angular 是在度。还请注意,我的y轴指向下,所以递增的Angular 是顺时针从x轴开始(指向右)
**但是,这只适用于180度以下的饼。**对于较大的饼,您需要反转叉积条件,以便在未填充的饼部分内渲染,而不是像这样:
代码可以进一步优化,例如
x*uy
可以改为for(...,xuy=x*uy;...;...,xuy+=uy)
这样的循环中的加法,消除了内部循环中的缓慢乘法。**[edit 1]**为了更清楚,我们有这样的东西:
(x*uy)
是在x
的每次迭代中计算的。x
是递增的,所以我们可以从之前的值((x-1)*uy)+uy
计算(x*uy)
的值,而不需要乘法,因为((x-1)*uy)
是最后一次迭代的值。所以添加一个变量来保存它可以摆脱重复的乘法:所以最初的乘法只做一次,然后它只是加法…
而且这种渲染方式是完全可并行的……