资源简介
计算机图形学中采用活性边表算法,实现多边形光栅化,本题目主要是在C语言和Win32控制台应用程序的基础上在屏幕上绘制多边形。
代码片段和文件信息
// AET.cpp : 定义控制台应用程序的入口点。
//
#include “stdafx.h“
#include “conio.h“
#include “windows.h“
void InitCoordSys( HWND hwnd HDC hdc) ;
void AET(HDC hdc);
typedef struct ET
{
double x;
long ymax;
double vk;
struct ET *next;
}ET;
int _tmain(int argc _TCHAR* argv[])
{
//获?取¨?控?制?台¬¡§窗ä¡ã口¨²句?柄À¨²
HWND hwnd = GetConsoleWindow();
//获?取¨?控?制?台¬¡§窗ä¡ã口¨²设¦¨¨备À?句?柄À¨²
HDC hdc = GetDC(hwnd);
//修T改?画-刷¡é颜?色¦?
::Selectobject( hdc GetStockobject( DC_BRUSH ));
::SetDCBrushColor( hdc RGB(02550)); //改?成¨¦想?要°a的Ì?颜?色¦?
//修T改?画-笔À¨º颜?色¦?
::Selectobject( hdc GetStockobject( DC_PEN));
::SetDCPenColor( hdc RGB( 0255 0));
InitCoordSys( hwnd hdc) ;
AET(hdc);
getch();
ReleaseDC( hwnd hdc );
return 0;
}
void AET(HDC hdc)
{
ET *etEdge;
int BucketL;//桶ª¡ã长¡è
int i max=-100min=10000sides;
POINT spt[7];
printf(“Please enter the number of sides of the polygon:\n“);
scanf(“%d“&sides);
printf(“Please enter the coordinate:\n“);
for (int c=0;c {
scanf(“%d %d“&spt[c].x&spt[c].y);
}
::Polygon(hdcsptsides);
// 求¨®出?最Á?大䨮的Ì?y值¦Ì和¨ª最Á?小?的Ì?y值¦Ì,ê?即¡ä占?用®?的Ì?最Á?大䨮扫¦¡§描¨¨线?数ºy
for (i=0; i< sides-1; i++)
{
if (spt[i].y > max) max = spt[i].y;
if (spt[i].y < min) min = spt[i].y;
}
BucketL = max-min+1; // 最Á?大䨮扫¦¡§描¨¨线?数ºy
etEdge = new ET[BucketL]; //长¡è度¨¨为aBucketL的Ì?创ä¡ä建¡§边À?表À¨ª
for (i=0; i {
etEdge[i].next = NULL;
}
// 根¨´据Y所¨´给?边À?求¨®出?边À?表À¨ª
for (i=0; i {
int m = i+1;
if (spt[i].y < spt[m].y) //第̨²i个?点Ì?的Ì?y坐Á?标À¨º小?于®¨²下?一°?个?点Ì?的Ì?y坐Á?标À¨º
{
ET *q = new ET();
q->x = spt[i].x;
q->ymax = spt[m].y;
q->vk = (double)(spt[m].x-spt[i].x)/(spt[m].y-spt[i].y); // 1/k的Ì?值¦Ì
q->next = NULL;
ET* p = &etEdge[spt[i].y-min];
while (p->next != NULL)
p = p->next;
p->next = q;
}
else if(spt[i].y > spt[m].y) //第̨²i个?点Ì?的Ì?坐Á?标À¨º大䨮于®¨²下?一°?个?点Ì?的Ì?坐Á?标À¨º
{
ET *q = new ET();
q->x = spt[m].x;
q->ymax = spt[i].y;
q->vk = (double)(spt[i].x-spt[m].x)/(spt[i].y-spt[m].y); // 1/k的Ì?值¦Ì
q->next = NULL;
ET* p = &etEdge[spt[m].y-min];
while (p->next != NULL) p = p->next;
p->next = q;
}
}
ET *p;
int flag=1;
// 将?第̨²一°?个?不?为a空?的Ì?边À?表À¨ª中D的Ì?边À?与®?AET表À¨ª合?并¡é
for (i=0; i< BucketL; i++)
{
if (etEdge[i].next != NULL)
{
p = etEdge[i].next;
etEdge[i].next = NULL;
break;
}
}
double x = p->x; //横¨¢向¨°扫¦¡§描¨¨一°?行D的Ì?下?标À¨º
for(int y=min ;y {
ET* et = p;
double x_max = et->x; // 一°?行D中D最Á?右®¨°边À?的Ì?x值¦Ì
x = et->x; // 起e始º?值¦Ì,ê?一°?行D中D最Á?左Á¨®边À?的Ì?x值¦Ì
while(et!=NULL) // 求¨®一°?行D中D的Ì?最Á?后¨®一°?个?边À?界?点Ì?的Ì?x坐Á?标À¨º和¨ª起e始º?点Ì?的Ì?x坐Á?标À¨º
{
if(et->x > x_max) x_max=et->x;
if (et->x < x) x = et->x;
et = et->next;
}
flag=1;
while(x < x_max) //扫¦¡§描¨¨一°?
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 5180 2012-11-19 21:31 AET\AET\AET.cpp
文件 4358 2012-11-19 20:19 AET\AET\AET.vcxproj
文件 1307 2012-11-19 20:19 AET\AET\AET.vcxproj.filters
文件 143 2012-11-19 20:19 AET\AET\AET.vcxproj.user
文件 1525 2012-11-19 20:19 AET\AET\ReadMe.txt
文件 208 2012-11-19 20:19 AET\AET\stdafx.cpp
文件 233 2012-11-19 20:19 AET\AET\stdafx.h
文件 236 2012-11-19 20:19 AET\AET\targetver.h
文件 881 2012-11-19 20:19 AET\AET.sln
..A..H. 9216 2012-11-19 21:32 AET\AET.suo
目录 0 2012-11-19 21:45 AET\AET
目录 0 2012-11-19 21:45 AET
----------- --------- ---------- ----- ----
23287 12
- 上一篇:检查抄袭作业程序
- 下一篇:c++职工信息管理系统课程设计报告
评论
共有 条评论