• 大小: 8KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-16
  • 语言: C/C++
  • 标签: AET  活性边表  

资源简介

计算机图形学中采用活性边表算法,实现多边形光栅化,本题目主要是在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


评论

共有 条评论

相关资源