中点分割算法
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七位,所以越转越小!!!
需要改动!!就不弄了,要睡了!!