void CLineColor::BresenhamLine(CDC* pDC) { int dx = abs(P1.x - P0.x); int dy = abs(P1.y - P0.y); bool bInterCharge = TRUE; int e, signX, signY, temp; signX = (P1.x > P0.x) ? 1 : ((P1.x < P0.x) ? -1 : 0); signY = (P1.y > P0.y) ? 1 : ((P1.y < P0.y) ? -1 : 0); if (dy > dx) { temp = dx; dx = dy; dy = temp; bInterCharge = FALSE; } e = -dx; CPoint p = P0; for (int i = 1; i <= dx; i++) { pDC->SetPixelV(p.x, p.y, RGB(0, 0, 255)); if (bInterCharge) p.x += signX; else p.y += signY; e += 2 * dy; if (e >= 0) { if (bInterCharge) p.y += signY; else p.x += signX; e -= 2 * dx; } } }以以上代码为模板写一个DDA算法
时间: 2023-03-27 12:00:43 浏览: 90
void CLineColor::DDALine(CDC* pDC) {
float dx = P1.x - P.x;
float dy = P1.y - P.y;
float xIncrement, yIncrement, x = P.x, y = P.y;
int steps;
if (abs(dx) > abs(dy)) {
steps = abs(dx);
xIncrement = (dx > ) ? 1 : -1;
yIncrement = dy / dx;
}
else {
steps = abs(dy);
yIncrement = (dy > ) ? 1 : -1;
xIncrement = dx / dy;
}
pDC->SetPixelV(round(x), round(y), RGB(, , 255));
for (int i = 1; i <= steps; i++) {
x += xIncrement;
y += yIncrement;
pDC->SetPixelV(round(x), round(y), RGB(, , 255));
}
}
相关问题
void Ctest1View::OnDraw(CDC* pDC) { Ctest1Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; CPoint p; int y1 = p1.y; int y2 = p2.y; int x2 = p2.x; int x1 = p1.x; double d=0; double k = 0; k = double((y1-y2)/(x1-x2)); if ((k <= 1) && (k >= 0)) { d = 0.5 - k; for (p = p1; p.x < p2.x; p.x++) { pDC->SetPixel(x1, y1, RGB(3, 6, 8)); if (d < 0) { p.y++; d += 1 - k; } else d -= k; } } }用bremenham算法完善以上编程实现画直线功能
下面是使用中点Bresenham算法实现画直线功能的代码:
```cpp
void Ctest1View::OnDraw(CDC* pDC)
{
Ctest1Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
CPoint p;
int y1 = p1.y;
int y2 = p2.y;
int x2 = p2.x;
int x1 = p1.x;
double k = 0;
k = double((y1 - y2) / (x1 - x2));
if ((k <= 1) && (k >= -1)) //绝对值小于等于1时
{
int dx = x2 - x1;
int dy = y2 - y1;
int yi = 1;
if (dy < 0) {
yi = -1;
dy = -dy;
}
int D = 2 * dy - dx;
int y = y1;
for (int x = x1; x <= x2; x++)
{
pDC->SetPixel(x, y, RGB(3, 6, 8));
if (D > 0) {
y += yi;
D -= 2 * dx;
}
D += 2 * dy;
}
}
else //绝对值大于1时
{
int dx = x2 - x1;
int dy = y2 - y1;
int xi = 1;
if (dx < 0) {
xi = -1;
dx = -dx;
}
int D = 2 * dx - dy;
int x = x1;
for (int y = y1; y <= y2; y++)
{
pDC->SetPixel(x, y, RGB(3, 6, 8));
if (D > 0) {
x += xi;
D -= 2 * dy;
}
D += 2 * dx;
}
}
}
```
在这个代码中,我们使用了中点Bresenham算法来绘制直线段。在绝对值小于等于1时,使用水平方向为主的扫描方式,如果斜率为正,则从左到右扫描;如果斜率为负,则从右到左扫描。在绝对值大于1时,使用垂直方向为主的扫描方式,如果斜率为正,则从上到下扫描;如果斜率为负,则从下到上扫描。
我们使用了CDC类的SetPixel函数来绘制像素点。使用RGB(3, 6, 8)来设置像素点的颜色。
void CTestView::DrawPolygon(CDC *pDC,CLine *line)//绘制立方体线框模型 { for(int nFace=0;nFace<6;nFace++) { CP2 t; for(int nVertex=0;nVertex<F[nFace].vN;nVertex++)//顶点循环 { ObliqueProject(P[F[nFace].vI[nVertex]]);//斜等测投影 if(0==nVertex) { line->MoveTo(pDC,ScreenP.x,ScreenP.y); t=ScreenP; } else line->LineTo(pDC,ScreenP.x,ScreenP.y); } line->LineTo(pDC,t.x,t.y);//闭合多边形 } }改为三棱锥
void CTestView::DrawPyramid(CDC *pDC, CLine *line)//绘制三棱锥线框模型
{
for(int nFace = 0; nFace < 4; nFace++)
{
CP2 t;
for(int nVertex = 0; nVertex < P[nFace].vN; nVertex++)
{
ObliqueProject(P[nFace].vI[nVertex]);//斜等测投影
if(0 == nVertex)
{
line->MoveTo(pDC, ScreenP.x, ScreenP.y);
t = ScreenP;
}
else
{
line->LineTo(pDC, ScreenP.x, ScreenP.y);
}
}
line->LineTo(pDC, t.x, t.y);//闭合多边形
}
for(int nVertex = 0; nVertex < P[4].vN; nVertex++)//底面的顶点循环
{
ObliqueProject(P[4].vI[nVertex]);//斜等测投影
if(0 == nVertex)
{
line->MoveTo(pDC, ScreenP.x, ScreenP.y);
}
else
{
line->LineTo(pDC, ScreenP.x, ScreenP.y);
}
}
}