中點分割演算法
1. 利用編碼的方法進行二維裁剪時有哪些判斷規則
要利用編碼製作和裁剪出不規則的圖形,具體步驟如下:
第一、啟動ps軟體,進入ps的界面後,將特定的圖片拖進去;
第二。打開圖片之後,雙擊該背景圖層右邊的鎖頭圖標,在「新建圖層」窗口上點擊「確定」;
2. 離散數學演算法
設要排序的數組是A[0]……A[N-1],首先任意選取一個數據(通常選用第一個數據)作為關鍵數據,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序。值得注意的是,快速排序不是一種穩定的排序演算法,也就是說,多個相同的值的相對位置也許會在演算法結束時產生變動。 一趟快速排序的演算法是: 1)設置兩個變數I、J,排序開始的時候:I=0,J=N-1; 2)以第一個數組元素作為關鍵數據,賦值給key,即 key=A[0]; 3)從J開始向前搜索,即由後開始向前搜索(J=J-1),找到第一個小於key的值A[J],並與A[I]交換; 4)從I開始向後搜索,即由前開始向後搜索(I=I+1),找到第一個大於key的A[I],與A[J]交換; 5)重復第3、4、5步,直到 I=J; (3,4步是在程序中沒找到時候j=j-1,i=i+1,直至找到為止。找到並交換的時候i, j指針位置不變。另外當i=j這過程一定正好是i+或j-完成的最後另循環結束) 例如:待排序的數組A的值分別是:(初始關鍵數據:X=49) 注意關鍵X永遠不變,永遠是和X進行比較,無論在什麼位子,最後的目的就是把X放在中間,小的放前面大的放後面。 A[0] 、 A[1]、 A[2]、 A[3]、 A[4]、 A[5]、 A[6]: 49 38 65 97 76 13 27 進行第一次交換後: 27 38 65 97 76 13 49 ( 按照演算法的第三步從後面開始找) 進行第二次交換後: 27 38 49 97 76 13 65 ( 按照演算法的第四步從前面開始找>X的值,65>49,兩者交換,此時:I=3 ) 進行第三次交換後: 27 38 13 97 76 49 65 ( 按照演算法的第五步將又一次執行演算法的第三步從後開始找 進行第四次交換後: 27 38 13 49 76 97 65 ( 按照演算法的第四步從前面開始找大於X的值,97>49,兩者交換,此時:I=4,J=6 ) 此時再執行第三步的時候就發現I=J,從而結束一趟快速排序,那麼經過一趟快速排序之後的結果是:27 38 13 49 76 97 65,即所以大於49的數全部在49的後面,所以小於49的數全部在49的前面。 快速排序就是遞歸調用此過程——在以49為中點分割這個數據序列,分別對前面一部分和後面一部分進行類似的快速排序,從而完成全部數據序列的快速排序,最後把此數據序列變成一個有序的序列,根據這種思想對於上述數組A的快速排序的全過程如圖6所示: 初始狀態 {49 38 65 97 76 13 27} 進行一次快速排序之後劃分為 {27 38 13} 49 {76 97 65} 分別對前後兩部分進行快速排序 {27 38 13} 經第三步和第四步交換後變成 {13 27 38} 完成排序。 {76 97 65} 經第三步和第四步交換後變成 {65 76 97} 完成排序。 圖示
記得採納啊
3. 計算機圖形學:線段剪裁中點分割演算法,要求用C++做,急求源代碼啊,謝謝! 752512212
#include <GL/glut.h>#include <stdlib.h>#include "iostream.h"int x0,y0,x1,y1;int Max(int a,int b,int c){ if(a>b) { if(a>c) return a; else return c; } else { if(b>c) return b; else return c; }}int Min(int a,int b,int c){ if(a<b) { if(a<c) return a; else return c; } else { if(b<c) return b; else return c; }}void DrawLine1(int x0,int y0,int x1,int y1){ int d,temp; temp=y0; d=2*(y1-y0)-(x1-x0); glBegin(GL_POINTS); glVertex2d(x0,y0); glEnd(); for(int k=x0+1;k<x1;k++) { if(d>=0) { glBegin(GL_POINTS); glVertex2d(k,temp+1); glEnd(); d=d+2*(y1-y0)-2*(x1-x0); temp=temp+1; } else { glBegin(GL_POINTS); glVertex2d(k,temp); glEnd(); d=d+2*(y1-y0); temp=temp; } } glBegin(GL_POINTS); glVertex2d(x1,y1); glEnd();}void DrawLine2(int x0,int y0,int x1,int y1){ int d,temp; temp=x0; d=2*(x1-x0)-(y1-y0); glBegin(GL_POINTS); glVertex2d(x0,y0); glEnd(); for(int k=y0+1;k<y1;k++) { if(d>=0) { glBegin(GL_POINTS); glVertex2d(temp+1,k); glEnd(); d=d+2*(x1-x0)-2*(y1-y0); temp=temp+1; } else { glBegin(GL_POINTS); glVertex2d(temp,k); glEnd(); d=d+2*(x1-x0); temp=temp; } } glBegin(GL_POINTS); glVertex2d(x1,y1); glEnd();}void DrawTriangle(int x0,int y0,int x1,int y1,int x2,int y2){ int xmin,xmax,ymin,ymax; float a,b,c; xmin=Min(x0,x1,x2); xmax=Max(x0,x1,x2); ymin=Min(y0,y1,y2); ymax=Max(y0,y1,y2); glColor3f(1.0f,0.0f,0.0f); glBegin(GL_POINTS); glVertex2d(x0,y0); glEnd(); glColor3f(0.0f,1.0f,0.0f); glBegin(GL_POINTS); glVertex2d(x1,y1); glEnd(); glColor3f(0.0f,0.0f,1.0f); glBegin(GL_POINTS); glVertex2d(x2,y2); glEnd(); for(float n=ymin;n<=ymax;n++) for(float m=xmin;m<xmax;m++) { a=((y1-y2)*m+(x2-x1)*n+x1*y2-x2*y1)/((y1-y2)*x0+(x2-x1)*y0+x1*y2-x2*y1); b=((y2-y0)*m+(x0-x2)*n+x2*y0-x0*y2)/((y2-y0)*x1+(x0-x2)*y1+x2*y0-x0*y2); c=((y0-y1)*m+(x1-x0)*n+x0*y1-x1*y0)/((y0-y1)*x2+(x1-x0)*y2+x0*y1-x1*y0); if(a>0 && b>0 && c>0) { float color0=a*1.0; float color1=b*1.0; float color2=c*1.0; glColor3f(color0,color1,color2); glBegin(GL_POINTS); glVertex2d(m,n); glEnd(); } } }void display(){/* clear all pixels */ glClear (GL_COLOR_BUFFER_BIT); glColor3f (1.0, 1.0, 1.0); glBegin(GL_POINTS); glVertex2d(x,y); 中間是點的坐標 glEnd(); */ /*下面的語句是畫一個白色的正方形*/ if((y1-y0)/(x1-x0)<=1) { DrawLine1(x0,y0,x1,y1); } else { DrawLine2(x0,y0,x1,y1); } DrawTriangle(35,35,135,185,235,35);/* don't wait! * start processing buffered OpenGL routines */ glFlush ();}void init (void) {/* select clearing color */ glClearColor (0.0, 0.0, 0.0, 0.0);/* initialize viewing values */ glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0, 600, 0, 600);}/* * Declare initial window size, position, and display mode * (single buffer and RGBA). Open window with "hello" * in its title bar. Call initialization routines. * Register callback function to display graphics. * Enter main loop and process events. */int main(int argc, char** argv){ cout<<"input x0,y0,x1,y1 :"<<endl; cin>>x0>>y0>>x1>>y1; glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); //設置窗口大小,以像素為單位 glutInitWindowSize (600, 600); glutInitWindowPosition (100, 100); glutCreateWindow ("hello");
希望能夠幫助到你,望採納,謝謝!
4. 計算機圖形學中有幾種直線裁剪演算法
有直接求交點法、Cohen-Sutherland演算法、中點分割演算法、Liang-Barskey演算法、Nicholl-Lee-Nicholl演算法、參數化裁剪(Cyrus-Beck)演算法
5. 計算機圖形學程序
你想要什麼嘛,我這學期也學了計算機圖形學的,什麼直線圓啊我都有
#include<graphics.h>
#include<math.h>
void Put(int x,int y,int w,int c)
{
int i,j;
j=w/2;
for(i=y-j;i<=y+j;i++)
putpixel(x,i,c);
}
void BresenhamLine(int x1,int y1,int x2,int y2,int width,int color)
{
int dx,dy,x,y,d,d1,d2,inc,tmp;
dx=x2-x1;
dy=y2-y1;
if(dx*dy>=0)
inc=1;
else inc=-1;
if(abs(dx)>abs(dy))
{
if(dx<0)
{
tmp=x1;
x1=x2;
x2=tmp;
tmp=y1;
y1=y2;
dx=-dx;
dy=-dy;
}
d=2*dy-dx;
d1=2*dy;
d2=2*(dy-dx);
x=x1;
y=y1;
Put(x,y,width,color);
while(x<x2)
{
x++;
if(d<0)
d+=d1;
else
{
y+=inc;
d+=d2;
}
Put(x,y,width,color);
}
}
else
{
if(dy<0)
{
tmp=x1;
x1=x2;
x2=tmp;
tmp=y1;
y1=y2;
dx=-dx;
dy=-dy;
}
d=2*dx-dy;
d1=2*dx;
d2=2*(dx-dy);
x=x1;
y=y1;
Put(x,y,width,color);
while(y<y2)
{
y++;
if(d<0)
d+=d1;
else
{
x+=inc;
d+=d2;
}
Put(x,y,width,color);
}
}
}
void main()
{
int gdriver=DETECT,gmode,x1,x2,y1,y2,c,w;
initgraph(&gdriver,&gmode,"");
printf("Please enter the point of head and rear:");
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
printf("the color:");
scanf("%d",&c);
printf("the width:");
scanf("%d",&w);
BresenhamLine(x1,y1,x2,y2,w,c);
getch();
closegraph();
}
6. 跪求計算機圖形學 中點分割演算法 C程序
在MFC下 中點畫圓MidPointCirle(point.x,point.y,30,RGB(0,255,0));
函數如下:
void CCricleView::MidPointCirle(int x0,int y0,int r, COLORREF color)
{
CClientDC dc(this);
int x,y,d;
x=0;
y=r;
d=5-4*r;
CirclePoint(x0,y0,x,y,color);
while (x<=y)
{
if(d<=0) d+=8*x+12;
else {d+=8*(x-y)+20;y--;}
x++;
CirclePoint(x0,y0,x,y,color);
}
}
void CCricleView::CirclePoint(int x0,int y0,int x,int y,COLORREF color)
{
CClientDC dc(this);
dc.SetPixel(x0+x,y0+y,color);
dc.SetPixel(x0+x,y0-y,color);
dc.SetPixel(x0-x,y0+y,color);
dc.SetPixel(x0-x,y0-y,color);
dc.SetPixel(x0+y,y0+x,color);
dc.SetPixel(x0+y,y0-x,color);
dc.SetPixel(x0-y,y0+x,color);
dc.SetPixel(x0-y,y0-x,color);
}
中點畫線
void CLineView::MidPointLine(int x0, int y0, int x1, int y1, COLORREF crColor)
{
CClientDC dc(this);
int a,b,dt1,dt2,d,x,y;
a=y0-y1;
b=x1-x0;
d=2*a+b;
dt1=2*(a+b);
dt2=2*a;
x=x0;y=y0;
dc.SetPixel(x,y,crColor);
while (x<x1)
{
if (d<0)
{
x++;
y++;
d+=dt1;
}
else
{
x++;
d+=dt2;
}
dc.SetPixel(x,y,crColor);
}
}
7. 求二維圖形剪裁演算法的實現 要求用C++ 源代碼
你需要怎樣的裁剪哦.
8. 計算機圖形學直線段裁剪演算法或二維基本變換演算法,能復制運行的來啊,謝謝大俠們了 啊
#include"graphics.h"
#include"math.h"
typedef struct Point /* 點 */
{
int x;
int y;
}Point;
/* 點的平移變換 */
void PinYi(int * x,int * y,int tx,int ty)
{
*x = *x + tx;
*y = *y + ty;
}
/* 點的旋轉變換 */
void XuanZhuan(int * x,int * y,float q)
{
int m ;
int n;
float Q;
Q = (3.1415926/180)*q;
m = (*x);
n = (*y);
*x = m * cos(Q) - n * sin(Q);
*y = m * sin(Q) + n * cos(Q);
}
void XuanZhuan_RY(int m,int n,int * x,int * y,float q)/* 繞(m,n)的旋轉*/
{
PinYi(x,y,-m,-n);
XuanZhuan(x,y,q);
PinYi(x,y,m,n);
}
void line_dda(int x1,int y1,int x2,int y2 ,COLORREF color)
{
float x = 0.0;
float y = 0.0;
float x3 = ( float )x1;
float y3 = ( float )y1;
float n;
n=( float )( abs( x2-x1 ) >= abs( y2-y1 ) ? abs( x2-x1 ) : abs( y2-y1 ) );
if( n != 0.0 )
{
x=( ( float )( x2-x1 ) ) / n;
y=( ( float )( y2-y1 ) ) / n;
}
while( n >= 0 )
{
putpixel( ( int )x3 , ( int )y3 , color );
x3 += x ;y3 += y ;n -= 1.0;
}
}
void line(Point i,Point j,COLORREF color){
line_dda(i.x,i.y,j.x,j.y,color);
}
Point p[4]={-50,50,50,50,-50,-50,50,-50};
int PY[2]={0,0},XZ=0;
void main()
{
int width=600,height=480;
int zbx=200,zby=200;
COLORREF color=0x00ff00;
char ch;
initgraph(width, height);
ch=getch();
for(int o=0;o<4;o++)
PinYi(&p[o].x,&p[o].y,zbx,zby);
while(ch=getch())
{
PY[0]=0;PY[1]=0;
XZ=0;
switch(ch){
case 'q': XZ--;break;
case 'e': XZ++;break;
case 'w': PY[1]--;break;
case 's': PY[1]++;break;
case 'a': PY[0]--;break;
case 'd': PY[0]++;break;
//default :return 0;
}
for(int o=0;o<4;o++)
{
PinYi(&p[o].x,&p[o].y,PY[0],PY[1]);
PinYi(&zbx,&zby,PY[0],PY[1]);
XuanZhuan_RY(zbx,zby,&p[o].x,&p[o].y,XZ);
}
cleardevice();
line(p[0],p[1],color);
line(p[1],p[2],color);
line(p[2],p[3],color);
line(p[3],p[0],color);
}
}
有個問題是,,旋轉的時候因為π取的3.1415926七位,所以越轉越小!!!
需要改動!!就不弄了,要睡了!!