随笔分类 -  computer-graphics 学习笔记

是跟着邓亚洲的视频学得
坐标系空间转换问题
摘要:最近在学3D管线,从view到screen变换的时候,涉及到顶点坐标空间的转换,是极简单的问题,看下图:黑色屏幕上存在坐标系0(红色)和坐标系1(黄色),坐标系1空间有一点P(x1,y1),问这个屏幕像素点P在坐标系0下的坐标?肉眼就可以看出来答案:是(m+x1,n-y1)。难的是严谨的数学推理,一步“因为”一步“所以”的推导出结论。我大概是退化了,花了两个小时才想出来一种思路。---------------------------------------已知在坐标系1下,P点坐标(x1,y1),即:P点相对O1点向上偏移y1,向右偏移x1(记做条件1);已知在坐标系0下,O1点坐标(m,n. 阅读全文

posted @ 2013-04-03 20:02 weiweishuo 阅读(276) 评论(0) 推荐(0)

圆的角度DDA算法初试
摘要:听老师讲到dx=-r*sini*di;dy=r*cosi*di(i表示角度),就关掉视频干别的了。早起猜了猜后续算法,核心思想应该是:不同半径的圆周长不同,为保证长为C的圆周描绘连续,保证有C个像素点,这样di=2PI/C=r,即圆心角每增加di,圆周长增加1像素.从公式看出,r越大,圆心角细分的越厉害,i的累加误差越小。我测了下r=10情形下,累加误差达到0.3,但r=100时,累加误差就只0.03了。 按照如下坐标系: 只需算出区域1的像素点,再对称出2区域,其余区域就可以由区域1,2做x/y对称得到。 流程图画的很丑:下面是代码:void drawCircle_dda(int x0,i. 阅读全文

posted @ 2013-03-12 16:20 weiweishuo 阅读(1151) 评论(0) 推荐(0)

bresenham直线算法
摘要:思路很明了的一个算法,没有中点划线法那么绕(我需要小心的判断_2Fm>0意味着什么)。 基本原理从某处摘得:设直线方程为yi+1=yi+k(xi+1-xi)+k。假设列坐标象素已经确定为xi,其行坐标为yi。那么下一个象素的列坐标为xi+1,而行坐标要么为yi,要么递增1为yi+1。是否增1取决于误差项d的值。误差项d的初值d0=0,x坐标每增加1,d的值相应递增直线的斜率值k,即d=d+k。一旦 d≥1,就把它减去1,这样保证d在0、1之间。当d≥0.5时,直线与垂线x=xi+1交点最接近于当前象素(xi,yi)的右上方象素(xi+1,yi+1);而当d<0.5时,更接近于右方象 阅读全文

posted @ 2013-03-11 18:24 weiweishuo 阅读(1959) 评论(0) 推荐(0)

中点划线法
摘要:原理是这样的,看下图:【注意:一个方格是一个像素,像素坐标按中心计算,看见两个大绿点儿没?】 由给定的(x0,y0),(x1,y1)算出直线L的一般描述式_F(x,y)=ax+by+c=0。直线的取向并不止上图一种,不同取向的处理略有不同(正负加减的区别而已),下面内容都按上图情况,代码里也集中注释这一块儿。 (x0,y0)既定,先考察(x0+1,Ym),即(x0+1,y0-0.5)点相对直线L的上下位置关系,确切说是相对(x0+1,Yline)的上下位置关系,用的是高中解析几何:_Fm=F(x0+1,y-0.5)=a(x0+1)+b(y0-0.5)+c,通过_Fm正负做推论:(_Fm> 阅读全文

posted @ 2013-03-10 20:35 weiweishuo 阅读(795) 评论(0) 推荐(0)

直线的dda算法
摘要:就是最普通的dda算法,没有任何拓展:View Code 1 void drawLine_dda_float(int x0,int y0,int x1,int y1){ 2 //1000*100次,66ms 3 int x0_x1=x1-x0; 4 int y0_y1=y1-y0; 5 if((x0_x1>0?x0_x1:-x0_x1)>(y0_y1>0?y0_y1:-y0_y1)){ 6 //直线趋于水平,故沿x轴逐点描画 7 //保证x0_x1指向x轴正方向 8 if(x0_x1<0){ 9 ... 阅读全文

posted @ 2013-03-09 12:01 weiweishuo 阅读(696) 评论(0) 推荐(0)

导航