导航:首页 > 源码编译 > 画线算法

画线算法

发布时间:2022-02-09 08:02:13

Ⅰ 日本画线算法 原理

这不是新的算法,它和我们的乘法竖式其实是一样的。
算交点数就能得出乘法的结果,这不奇怪,
从最简单的乘法看,比如1x3=3,
你在横向
划一条线,纵向划三条线,交点数当然是3个。

Ⅱ 用C++如何实现bresenham画线算法计算机图形学上面有个drawpixel的函数。不知道怎么用。

drawpixel()函数这就是VC画点的,不同的平台由不同的函数来画点,这个是API函数不管什么平台归结到底都是调用这个函数来画点。
COLORREF SetPixel(
HDC hdc, // handle to DC
int X, // x-coordinate of pixel
int Y, // y-coordinate of pixel
COLORREF crColor // pixel color
);

Ⅲ Bresenham画线算法决策变量的初值

书上?什么书?

Ⅳ bresenham画线算法与计算机图形学画线算法有什么不同

计算机图形学画线算法很多,有DDA算法、逐点比较法、Bresenham算法等,Bresenham算法是最着名的,而且算法中只用到了加法和移位运算,没有浮点数,没有乘除法,所以执行速度最快。

Ⅳ 利用C语言编写 能够画出任意斜率的直线算法程序(利用中点画线法改编)

将DDA算法改成中点划线算法即可
// DDA画线View.cpp : implementation of the CDDAView class
//

#include "stdafx.h"
#include "DDA画线.h"

#include "DDA画线Doc.h"
#include "DDA画线View.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CDDAView

IMPLEMENT_DYNCREATE(CDDAView, CView)

BEGIN_MESSAGE_MAP(CDDAView, CView)
//{{AFX_MSG_MAP(CDDAView)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDDAView construction/destruction

CDDAView::CDDAView()
{
// TODO: add construction code here

}

CDDAView::~CDDAView()
{
}

BOOL CDDAView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs

return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CDDAView drawing

void CDDAView::OnDraw(CDC* pDC)
{
CDDADoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
int xx,yy,x2,y2,m,n;
float dx,dy,k,x,y;
int x0=50,y0=500,x1=50,y1=50;
if(x0>x1)
{
m=x0;x0=x1;x1=m;
m=y0;y0=y1;y1=m;
}
dx=x1-x0;
dy=y1-y0;
k=dy/dx;
if(x0==x1)
{
if(y0>y1)
{
n=y0;
y0=y1;
y1=n;
}
for(y2=y0;y2<=y1;)
{
for(n=-10;n<11;)
{
pDC->SetPixel(x0+n,y2,255);
n++;
}
y2=y2+3;
}

}
if(k>=-1&&k<=1.0)
{
y=y0;
for(x2=x0;x2<=x1;)
{
yy=(int)(y+0.5);
for(n=-10;n<11;)
{
pDC->SetPixel(x2,yy+n,255);
n++;
}
y=y+k;
x2++;
}
}
else if(k>1)
{
x=x0;
k=dx/dy;
for(y2=y0;y2<=y1;)
{
xx=(int)(x+0.5);
for(n=-10;n<11;)
{
pDC->SetPixel(xx+n,y2,255);
n++;
}
x=x+k;
y2++;
}
}
else if(k<-1)
{
x=x1;
k=dx/dy;
for(y2=y1;y2<=y0;)
{
xx=(int)(x+0.5);
for(n=-10;n<11;)
{
pDC->SetPixel(xx+n,y2,255);
n++;
}
x=x+k;
y2++;
}

}
// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CDDAView printing

BOOL CDDAView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}

void CDDAView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}

void CDDAView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CDDAView diagnostics

#ifdef _DEBUG
void CDDAView::AssertValid() const
{
CView::AssertValid();
}

void CDDAView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}

CDDADoc* CDDAView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDDADoc)));
return (CDDADoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CDDAView message handlers

Ⅵ Bresenham画线算法

基本上Bresenham画线算法的思路如下:
//
假设该线段位于第一象限内且斜率大于0小于1,设起点为(x1,y1),终点为(x2,y2).
//
根据对称性,可推导至全象限内的线段.
1.画起点(x1,y1).
2.准备画下个点。x坐标增1,判断如果达到终点,则完成。否则,由图中可知,下个要画的点要么为当前点的右邻接点,要么是当前点的右上邻接点.
2.1.如果线段ax+by+c=0与x=x1+1的交点的y坐标大于M点的y坐标的话,下个点为U(x1+1,y1+1)
2.2.否则,下个点为B(x1+1,y1+1)
3.画点(U或者B).
4.跳回第2步.
5.结束.
这里需要细化的是怎么判断下个要画的点为当前点的右邻接点还是当前点的右上邻接点.
设线段方程:ax+by+c=0(x1<x<x2,y1<y<y2)
令dx=x2-x1,dy=y2-y1
则:斜率-a/b
=
dy/dx.
从第一个点开始,我们有F(x,1,y1)
=
a*x1+b*y1+c=0
下面求线段ax+by+c=0与x=x1+1的交点:
由a*(x1+1)+b*y+c
=
0,
求出交点坐标y=(-c-a(x1+1))/b
所以交点与M的y坐标差值Sub1
=
(-c-a(x1+1))/b
-
(y1+0.5)
=
-a/b-0.5,即Sub1的处始值为-a/b-0.5。
则可得条件当
Sub1
=
-a/b-0.5>0时候,即下个点为U.
反之,下个点为B.
代入a/b,则Sub1
=
dy/dx-0.5.
因为是个循环中都要判断Sub,所以得求出循环下的Sub表达式,我们可以求出Sub的差值的表达式.下面求x=x1+2时的Sub,即Sub2
1.如果下下个点是下个点的右上邻接点,则
Sub2
=
(-c-a(x1+2))/b
-
(y1+1.5)
=
-2a/b
-
1.5
故Sub差值Dsub
=
Sub2
-
Sub1
=
-2a/b
-
1.5
-
(-a/b-0.5)
=
-a/b
-
1.代入a/b得Dsub
=
dy/dx
-1;
2.如果下下个点是下个点的右邻接点,
Sub2
=
(-c-a(x1+2))/b
-
(y1+0.5)
=
-2a/b
-
0.5
故Sub差值Dsub
=
Sub2
-
Sub1
=
-2a/b
-
0.5
-
(-a/b-0.5)
=
-a/b.
代入a/b得Dsub
=
dy/dx;
于是,我们有了Sub的处始值Sub1
=
-a/b-0.5
=
dy/dx-0.5,又有了Sub的差值的表达式Dsub
=
dy/dx
-1
(当Sub1
>
0)或
dy/dx(当Sub1
<
0).细化工作完成。
于是pcode可以细化如下:
//
Pcode
for
Bresenham
Line
//
By
SoRoMan
x=x1;
y=y1;
dx
=
x2-x1;
dy
=
y2-y1;
Sub
=
dy/dx-0.5;
//
赋初值,下个要画的点与中点的差值
DrawPixel(x,
y);
//
画起点
while(x<x2)
{
x++;
if(Sub
>
0)
//
下个要画的点为当前点的右上邻接点
{
Sub
+=
dy/dx
-
1;
//下下个要画的点与中点的差值
y++;
//
右上邻接点y需增1
}
else//
下个要画的点为当前点的右邻接点
{
Sub
+=
dy/dx;
}
//
画下个点
DrawPixel(x,y);
}
PS:一般优化:
为避免小数转整数以及除法运算,由于Sub只是用来进行正负判断,所以可以令Sub
=
2*dx*Sub
=
2dy-dx,则
相应的DSub
=
2dy
-
2dx或2dy.
思考1:如果Sub
=
0时,会产生取两个点都可以的问题。这个问题还没深入。

Ⅶ bresenham画线算法

用MFC还要bresenham干嘛

Ⅷ 划线算法 原理

1.这不是新的算法,它和我们的乘法竖式其实是一样的

2.算交点数就能得出乘法的结果,这不奇怪,
从最简单的乘法看,比如1x3=3
你在横向划一条线,纵向划三条线,交点数当然是3个

再比如2x3=6
你在横向划两条线,纵向划三条线,交点数当然是6个,不信,你可以数。
原因是:横向一条线,与纵向三条线,交点数是3个;
而现在,横向有两条线,所以交点数有2x3个,也就是6个

这是一位数的乘法,已经清楚了。
但对于多位数的呢,也可以用和上面一样的方法,横向划一组线,纵向划一组线,然后数交点数,对于比较大的数,恐怕大家没耐心把点数完。

3.对于多位数的乘法,用视频中的划线法,其实和我们的乘法竖式其实是一样的。
视频的例子:21x13=273

乘法竖式:
21
x13
----
63
21
----
273

我们在视屏中,看到有数出:2,1,6,3这么些点数,并且把6和1相加变成7放到了结果中。
而在以上乘法竖式中,也有2,1,6,3这么些数字,并且也是把6和1相加变成7放到了结果中。

视频的例子:123x321=39483

乘法竖式:
123
x321
-------
123
246
369
-------
39483

我们在视屏中,看到有把点数:1,4,9相加得出14,而14中的这个1被进到前面一位去了;
而在以上乘法竖式中,也有把数字:1,4,9相加得出14,而14中的这个1被进到前面一位去。

Ⅸ 求长方形之间的画线算法

长方形之间的画线是怎么画的?都不明白楼主想画什么线.

阅读全文

与画线算法相关的资料

热点内容
多传感数据融合算法 浏览:210
access2010压缩 浏览:149
安卓最旧系统是什么 浏览:707
草根到百万程序员 浏览:696
学员招聘app哪个好 浏览:448
感到解压就拍拍手 浏览:110
php404页面代码 浏览:717
php唯一编号 浏览:601
硬盘文件夹没法打开 浏览:443
访问外网的svn服务器地址 浏览:878
想去自由行有什么好的app 浏览:213
视频监控数据库如何加密 浏览:761
解压直接能用的软件 浏览:711
服务器10ge网口是什么意思 浏览:862
travelboast安卓怎么设置路线 浏览:53
播放解压的图 浏览:230
新建一个名为hux的文件夹 浏览:534
桥水基金加密货币 浏览:206
还有什么好app 浏览:156
微软最惨的源码 浏览:47