//函数功能:图像中移动线
	//参数:坐标点
	long CMapEditor10View::MoveLin(CPoint point)			 //
	{	
		int i;
		POINT pt;
		POINT lins[500];
		if(step==0)
		{
			startPnt.x=0;
			startPnt.y=0;
			return (0);
		}
		else if(step==1)
		{
			CClientDC dc(this);							//获得本窗口或当前活动视图
			CPen newpen(PS_SOLID,2,linColor);	//构造画笔对象
			dc.SetROP2(R2_NOTXORPEN);
			CPen *pOldPen=dc.SelectObject(&newpen);		//将画笔选入DC,SelectObject函数返回先前画笔

			long disX=point.x - startPnt.x;				//计算坐标偏移
			long disY=point.y - startPnt.y;

			for(i=0;i< LinPntNum;i++)
			{
				if(i==0)
					dc.MoveTo(linPnt[i]);
				else
					dc.LineTo(linPnt[i]);

				pt.x=linPnt[i].x + disX;
				pt.y=linPnt[i].y + disY;

				lins[i]=pt;
			}
			CPen oldpen(PS_SOLID,2,linColor);		//构造画笔对象
			dc.SelectObject(&oldpen);						//将画笔选入DC,SelectObject函数返回先前画笔

			for(i=0;i<LinPntNum;i++)
			{
				linPnt[i]=lins[i];
				if(i==0)
					dc.MoveTo(lins[i]);
				else
					dc.LineTo(lins[i]);
			}


			startPnt=point;
			::ReleaseDC(m_hWnd,dc);
		}
		return (1);
	}
Beispiel #2
0
void human(void){// 棒人間
  newpen(win, 1);
  fillarc(win,x, 25.0, 5.0, 5.0, 0.0, 360.0, 1);
  line(win, x, 5.0, PENUP);
  line(win, x, 20.0, PENDOWN);
  line(win, x, 5.0, PENUP);
  line(win, x-5.0, 0.0, PENDOWN);
  line(win, x, 5.0, PENUP);
  line(win, x+5.0, 0.0, PENDOWN);
  line(win, x, 13.0, PENUP);
  line(win, x-5.0, 17.0, PENDOWN);
  line(win, x, 13.0, PENUP);
  line(win, x+5.0, 17.0, PENDOWN);
}
	//函数功能:图像上擦除线
	//参数:要擦除线的编号
	long CMapEditor10View::EraseLine(long toErase)     //
	{
		int num=0;

		num=toErase;										//保存待删除线索引号
		CPen newpen(PS_SOLID,2,RGB(255,255,255));			//构造画笔对象
		CClientDC dc(this);									//获得本窗口或当前活动视图
		dc.SetROP2(R2_NOTXORPEN);
		CPen *pOldPen=dc.SelectObject(&newpen);				//将画笔选入DC,SelectObject函数返回先前画笔
		//设置异或模式画点 //dc.SetROP2(R2_NOT);	
		//这里抹去一个一条线

		int ii=0;
		int j=0;
		int datalen=0;
		int ndxlen=0;
		int dotnum=0;
		int datff=0;
		CPoint ptemp;
		CPoint todel;
		int linlen=sizeof(LIN_NDX_STRU);
		int plen=sizeof(D_DOT);

		if(1==GLinFCreated)
		{
			datalen=GLinTmpFile2.GetLength();
			ndxlen=GLinTmpFile1.GetLength();
			//linedata.Seek(0,CFile::begin);
			GLinTmpFile1.Seek( (toErase -1) * linlen,CFile::begin);  //找到索引号为toErase的线
			GLinTmpFile1.Read(&LIN_NDX_STRU,  linlen);
			dotnum=LIN_NDX_STRU.dotNum;
			datff=LIN_NDX_STRU.datOff;
			GLinTmpFile2.Seek(datff,CFile::begin);				  //数据中找到索引号为toErase的线数据

			GLinTmpFile2.Read(&D_DOT, plen );				 //线第一个点
			ptemp.x=D_DOT.x;
			ptemp.y=D_DOT.y;
			dc.MoveTo(ptemp);
			for(j=1 ; j < dotnum ; j++)						//从第2个点开始
			{
				GLinTmpFile2.Read(&D_DOT, plen );
				todel.x=D_DOT.x;
				todel.y=D_DOT.y;
				dc.LineTo(todel);
			}

		}
		return 1;

	}
	long CMapEditor10View::DrawConLine( )
	{
		int i=0;
		CClientDC dc(this);							//获得本窗口或当前活动视图
		CPen newpen(PS_SOLID,2,linColor);	//构造画笔对象
		CPen *pOldPen=dc.SelectObject(&newpen);		//将画笔选入DC,SelectObject函数返回先前画笔
		for(i=0;i<LinPntNum;i++)
		{
			if(i==0)
				dc.MoveTo(linPnt[i]);
			else
				dc.LineTo(linPnt[i]);
		}

		return 1;
	}
	long CMapEditor10View::DrawConLine(int num)
	{

		int ii=0;
		int j=0;
		int datalen=0;
		int ndxlen=0;
		int dotnum=0;
		int datff=0;
		CPoint ptemp;

		int linlen=sizeof(LIN_NDX_STRU);
		int plen=sizeof(D_DOT);
		//修改索引文件
		if(1==GLinFCreated)
		{
			datalen=GLinTmpFile2.GetLength();
			ndxlen=GLinTmpFile1.GetLength();

			GLinTmpFile1.Seek( (num -1) * linlen,CFile::begin);  //找到索引号为toErase的线
			GLinTmpFile1.Read(&LIN_NDX_STRU,  linlen);
			dotnum=LIN_NDX_STRU.dotNum;
			datff=LIN_NDX_STRU.datOff;
			GLinTmpFile2.Seek(datff,CFile::begin);           //数据中找到索引号为toErase的线数据

			CClientDC dc(this);							//获得本窗口或当前活动视图
			CPen newpen(PS_SOLID,2,RGB(192,0,0));	//构造画笔对象
			CPen *pOldPen=dc.SelectObject(&newpen);		//将画笔选入DC,SelectObject函数返回先前画笔


			for(j=0; j < dotnum ; j++)
			{
				GLinTmpFile2.Read(&D_DOT,plen);
				ptemp.x=D_DOT.x;
				ptemp.y=D_DOT.y;
				if(j==0)
					dc.MoveTo(ptemp);
				else
					dc.LineTo(ptemp);
			}


		}
		return 1;	

	}
Beispiel #6
0
/*=========================
//	OnDrawCouple
//
===========================*/
void Ploygon:: OnDrawCouple(CDC* pDC)
{
	CPen newpen(PS_SOLID,1,RGB(255,0,0));
	CPen *old=pDC->SelectObject(&newpen);
	pDC->TextOut(320,350,_T("多边形扫描转换算法"));
	
	/*================
	//	绘制多边形区域
	//
	=================*/
	spt[0]=CPoint(2*pbei,3*pbei);
	pDC->TextOut(spt[0].x-10,spt[0].y-5,_T("0"));
	
	spt[1]=CPoint(2*pbei,9*pbei);
	pDC->TextOut(spt[1].x-10,spt[1].y,_T("1"));
	
	spt[2]=CPoint(7*pbei,11*pbei);
	pDC->TextOut(spt[2].x,spt[2].y,_T("2"));
	
	spt[3]=CPoint(13*pbei,7*pbei);
	pDC->TextOut(spt[3].x+5,spt[3].y,_T("3"));
	
	spt[4]=CPoint(13*pbei,1*pbei);
	pDC->TextOut(spt[4].x+5,spt[4].y,_T("4"));
	
	spt[5]=CPoint(7*pbei,5*pbei);
	pDC->TextOut(spt[5].x,spt[5].y-20,_T("5"));
	
	spt[6]=CPoint(2*pbei,3*pbei);
	//pDC->TextOut(spt[6].x,spt[6].y,_T("6"));
	
	//spt[7]=CPoint(100,100);
	
	pDC->Polyline(spt,7);
	
	pDC->SelectObject(old);

	/*===============
	//	CoupleFill
	//
	=================*/

	CoupleFill(pDC);
}
	//函数功能:存储选定的线
	//参数:要存储的线号
	long CMapEditor10View::SelectLin(int num)     //存储选定的线点
	{	
		CPen newpen(PS_SOLID,2,RGB(255,255,255));	//构造画笔对象
		CClientDC dc(this);							//获得本窗口或当前活动视图
		CPen *pOldPen=dc.SelectObject(&newpen);		//将画笔选入DC,SelectObject函数返回先前画笔

		int ii=0;
		int j=0;
		int datalen=0;
		int ndxlen=0;
		int dotnum=0;
		int datff=0;
		CPoint ptemp;
		CPoint todel;
		int linlen=sizeof(LIN_NDX_STRU);
		int plen=sizeof(D_DOT);

		if(1==GLinFCreated)
		{
			datalen=GLinTmpFile2.GetLength();
			ndxlen=GLinTmpFile1.GetLength();

			GLinTmpFile1.Seek( (num -1) * linlen,CFile::begin);  //找到索引号为num的线
			GLinTmpFile1.Read(&LIN_NDX_STRU,  linlen);
			dotnum=LIN_NDX_STRU.dotNum;
			datff=LIN_NDX_STRU.datOff;
			GLinTmpFile2.Seek(datff,CFile::begin);           //数据中找到索引号为num的线数据

			for(j=0 ; j < dotnum ; j++)                //从第2个点开始
			{
				GLinTmpFile2.Read(&D_DOT, plen );
				todel.x=D_DOT.x;
				todel.y=D_DOT.y;
				linPnt[j]=todel;

			}

		}

		LinPntNum=dotnum;
		return 1;


	}
Beispiel #8
0
void draw(void *_prms)
{
  param_set *p = (param_set *) _prms;
  double x, y ; 
  double rad ;
  char tstr[20];

  rad = p->r[0];

  y = L*cos(rad)*SC; 
  x = L*sin(rad)*SC;
  gclr(*p->win);
  sprintf(tstr, "t = %.4f", *p->t);
  newrgbcolor(*p->win, 204,153, 0);
  fillrect(*p->win, -WD/2, -MG, WD, 18);
  newpen(*p->win, 1);
  moveto(*p->win, -x, 0);
  lineto(*p->win, x, 2*y);
  drawstr(*p->win, -WD/2+MG, HT-2*MG, 14, 0, tstr);
  copylayer(*p->win, 1, 0);
}
	//函数功能:移动点
	//参数:
	long CMapEditor10View::MovePntLBD(CPoint point)       
	{
		nowPoint=point;	 //存储当前点为前一点
		CPoint ptMove;
		FindNearestPnt(point);
		m_step++;
		ptMove=point;
		toMove=point;
		CPen newpen(PS_SOLID,2,RGB(255,0,0));	 //构造画笔对象
		CClientDC dc(this);	 //获得本窗口或当前活动视图
		CPen *pOldPen=dc.SelectObject(&newpen);	 //将画笔选入DC,SelectObject函数返回先前画笔
		//这里标亮要移动的点
		dc.MoveTo(ptMove.x,ptMove.y-6);
		dc.LineTo(ptMove.x,ptMove.y+6);
		dc.MoveTo(ptMove.x-6,ptMove.y);
		dc.LineTo(ptMove.x+6,ptMove.y);
		::ReleaseDC(m_hWnd,dc);

		return 1;

	}
Beispiel #10
0
	//函数功能:图像上擦除点
	//参数:点坐标
	long CMapEditor10View::ErasePoint(CPoint tempxy)		 
	{

		CPoint toErase;
		FindNearestPnt(tempxy) ;
		toErase=tempxy;									 //保存待删除点
		CPen newpen(PS_SOLID,2,RGB(255,255,255));		//构造画笔对象
		//获得本窗口或当前活动视图
		CClientDC dc(this);
		CPen *pOldPen=dc.SelectObject(&newpen);			//将画笔选入DC,SelectObject函数返回先前画笔
		//设置异或模式画点
		//这里抹去一个小十字
		dc.MoveTo(toErase.x,toErase.y-6);
		dc.LineTo(toErase.x,toErase.y+6);
		dc.MoveTo(toErase.x-6,toErase.y);
		dc.LineTo(toErase.x+6,toErase.y);
		GPntChanged=1;
		::ReleaseDC(m_hWnd,dc);
		return 1;

	}
Beispiel #11
0
/*=========================
//	OnDrawET
//
===========================*/
void Ploygon::OnDrawET(CDC* pDC)
{
	CPen newpen(PS_SOLID,1,RGB(255,0,0));
	CPen *old=pDC->SelectObject(&newpen);
	pDC->TextOut(320,350,_T("活跃边表算法"));
	
	POINT points[N]={{2,3},{2,9},{7,11},{13,7},{13,1},{7,5}};
	
	POINT spt[N+1];
	int i;
	
	for(i=0;i<N+1;i++){spt[i].x=points[i%N].x*pbei;spt[i].y=points[i%N].y*pbei;}
	
	POINT points1[N];
	for(i=0;i<N;i++)
	{
		points1[i].x=spt[i].x;
		points1[i].y=spt[i].y;
	}
	
    //draw the polygon
	pDC->TextOut(spt[0].x-10,spt[0].y-5,_T("0"));
	pDC->TextOut(spt[1].x-10,spt[1].y,_T("1"));
	pDC->TextOut(spt[2].x,spt[2].y,_T("2"));
	pDC->TextOut(spt[3].x+5,spt[3].y,_T("3"));
	pDC->TextOut(spt[4].x+5,spt[4].y,_T("4"));
	pDC->TextOut(spt[5].x,spt[5].y-20,_T("5"));
	
	pDC->Polyline(spt,N+1);
	
	COLORREF color=RGB(255,118,163);
	
	CPen newpen1(PS_SOLID,2,color);
	pDC->SelectObject(&newpen1);
	//CPen *old1=pDC->SelectObject(&newpen1);
	
	PolyFill(pDC,points1,color);
	
    //pDC->SelectObject(old);
}
Beispiel #12
0
/*水滴を落とす関数*/
int drop(int droparray[]){
  int d;//カウンタ変数
  int flag;//フラグ変数

  flag = 0;//フラグ

  /*ランダムに雫が発生*/
  if(rand() % 100 == 0){
    for(d=0; d<MAXNUMBER; d++){
      if(droparray[d] == -1){
	droparray[d] = 0;
	break;
      }
    }
  }
  
  /*水滴の描画*/
  for(d=0; d<MAXNUMBER; d++){
    if(droparray[d] != -1){
      newpen(win, 1);
      fillcirc(win, dropX(droparray[d]), dropY(droparray[d]), 5, 5);
    }
  }

  /*各要素にインクリメントしてフラグをたてる*/
  for(d=0; d<MAXNUMBER; d++){
    if(droparray[d] != -1){
      droparray[d]++;
    }
    if(droparray[d] == 180){
      droparray[d] = -1;
      flag = 1;
    }
  }
  
  /*フラグ分岐*/
  if(flag == 1) return 1;
  else return 0;
  
}
Beispiel #13
0
void LEVEL5(void){//レベル5の動作
  if(a==5){
    while(1){
      gclr(win);
      human();//棒人間
      input();//入力待ち
      
      newpen(win, 1);//色は白
      //防護壁表記
      fillrect(win,defence_x, defence_y, defence_w, defence_h1);
      fillrect(win,defence_x+40.0, defence_y+60.0, defence_w, defence_h2);
      fillrect(win,defence_x+80.0, defence_y, defence_w, defence_h3);
      defence_y -= 15.0;//速度
      
      atari();//当たり判定
      //一番下まで落ちたら    
      if(defence_y == 0){
	while(1){
	  gclr(win);//画面消去
	  human();//棒人間
	  input();//入力待ち
	  bougoheki();//防護壁	
	  atari();//当たり判定
	  newpen(win, 2);//太陽の色は赤で
	  fillcirc(win,all_x, all_y, 200, 200);//太陽
	  all_y-=5.0;//落下速度
	  
	  //太陽が防護壁に当たったら
	  if(all_y==280.0){
	    while(1){
	      gclr(win);//画面消去
	      human();//棒人間
	      input();//入力待ち
	      bougoheki();//防護壁
	      atari();//当たり判定
	      newpen(win, 2);//線は赤
	      
	      //太陽ぶつかった後の線
	      lastline();
	      msleep(time);
	      
	      if(explo_y1<0){//下に伸びた線が0以下になったら
		if(defence_x+40 < x && x < defence_x+80){//中にいれば
		  newpen(win, 1);
		  drawstr(win, 180, 250, 24, 0, "SAFE");
		  msleep(time*10);
		  gclr(win);
		  newpen(win, 1);
		  drawstr(win, 100, 300, 24, 0.0, "CONGRATULATIONS!");
		  drawstr(win, 170, 250, 24, 0.0, "CLEAR");
		  msleep(time*30);
		  exit(0);
		}
		else {//外にいれば
		  newpen(win, 1);
		  drawstr(win, 190, 250, 24, 0, "OUT");
		  msleep(time*10);
		  gclr(win);
		  newpen(win, 1);
		  drawstr(win, 150, 250, 24, 0.0, "GAMEOVER");
		  msleep(time*30);
		  exit(0);
		}
	      }
	    }
	  }
	  msleep(time);
	} 
      }
      msleep(time);   
    } 
  }
}
void CSkinDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作区矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;
		
		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		//画边线
		CPaintDC dc2(this);
		CRect rect;
		GetClientRect(rect);

		//背景绘图
		dc2.SetBkMode(TRANSPARENT);
		CDC MemDC;
		MemDC.CreateCompatibleDC(&dc2);
		CBitmap Bitmap;
		BITMAP bmpinfo;
		Bitmap.LoadBitmap(IDB_BK1);
		Bitmap.GetObject(sizeof(bmpinfo),& bmpinfo);  //获取图片信息
		CBitmap *pOldBitmap = MemDC.SelectObject(&Bitmap);
		
		dc2.StretchBlt(-1, -1, rect.Width()+2, rect.Height()+2, &MemDC, 0, 0, bmpinfo.bmWidth, bmpinfo.bmHeight, SRCCOPY);  //拉伸位图
//		dc2.BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &MemDC, rect.left, rect.top, SRCCOPY);
		MemDC.SelectObject(pOldBitmap);
		MemDC.DeleteDC();

		//外边框
		CPen *oldpen = NULL;
		CPen newpen(PS_SOLID, 1, RGB(27, 147, 186));
		oldpen = dc2.SelectObject(&newpen);

		dc2.MoveTo(rect.left, CORNER_SIZE);
		dc2.LineTo(CORNER_SIZE, rect.top);
		dc2.LineTo(rect.right - CORNER_SIZE - 1, rect.top);
		dc2.LineTo(rect.right - 1, CORNER_SIZE);
		dc2.LineTo(rect.right - 1, rect.bottom - CORNER_SIZE - 1);
		dc2.LineTo(rect.right - CORNER_SIZE - 1, rect.bottom - 1);
		dc2.LineTo(CORNER_SIZE, rect.bottom - 1);
		dc2.LineTo(rect.left, rect.bottom - CORNER_SIZE - 1);
		dc2.LineTo(rect.left, CORNER_SIZE);

		//填充空缺处
		dc2.MoveTo(rect.left + 1, CORNER_SIZE);
		dc2.LineTo(CORNER_SIZE + 1, rect.top);

		dc2.MoveTo(rect.right - CORNER_SIZE - 1, rect.top + 1);
		dc2.LineTo(rect.right - 1, CORNER_SIZE + 1);

		dc2.MoveTo(rect.right - 2, rect.bottom - CORNER_SIZE - 1);
		dc2.LineTo(rect.right - CORNER_SIZE - 1, rect.bottom - 1);

		dc2.MoveTo(CORNER_SIZE, rect.bottom - 2);
		dc2.LineTo(rect.left, rect.bottom - CORNER_SIZE - 2);

		dc2.SelectObject(oldpen);

		//内边框
		CPen newpen2(PS_SOLID, 1, RGB(196, 234, 247));
		oldpen = dc2.SelectObject(&newpen2);

		dc2.MoveTo(rect.left + 1, CORNER_SIZE + 1);
		dc2.LineTo(CORNER_SIZE + 1, rect.top + 1);
		dc2.LineTo(rect.right - CORNER_SIZE - 2, rect.top + 1);
		dc2.LineTo(rect.right - 2, CORNER_SIZE + 1);
		dc2.LineTo(rect.right - 2, rect.bottom - CORNER_SIZE - 2);
		dc2.LineTo(rect.right - CORNER_SIZE - 2, rect.bottom - 2);
		dc2.LineTo(CORNER_SIZE + 1, rect.bottom - 2);
		dc2.LineTo(rect.left + 1, rect.bottom - CORNER_SIZE - 2);
		dc2.LineTo(rect.left + 1, CORNER_SIZE + 1);
		CDialog::OnPaint();
	}
}
Beispiel #15
0
/*=========================
//	CoupleFill
//
===========================*/
void Ploygon::CoupleFill(CDC* pDC)
{

	CPen newpen(PS_SOLID,1,RGB(0,255,0));
	CPen *old=pDC->SelectObject(&newpen);

	int s=0;								//记录随着Scan往上,不再相交的edge
	int p[5];								//每根扫描线交点

	int pmin=spt[0].y,pmax=spt[0].y;		//记录边中ymax ymin

	//0-6	i<->i+1 (0 1) --- (5 6)
	for(int i=0;i<6;i++)					//建立边表 (每条边的信息) (0 5)
	{
		edge[i].dx=(float)(spt[i+1].x-spt[i].x)/(spt[i+1].y-spt[i].y);//斜率倒数

		if(spt[i].y<=spt[i+1].y)
		{
			edge[i].num=i;
			edge[i].ymin=spt[i].y;
			edge[i].ymax=spt[i+1].y;
			edge[i].xmin=(float)spt[i].x;
			edge[i].xmax=(float)spt[i+1].x;

			if(pmax<spt[i+1].y)pmax=spt[i+1].y;
			if(pmin>spt[i].y)pmin=spt[i].y;
		}
		else
		{
			edge[i].num=i;
			edge[i].ymin=spt[i+1].y;
			edge[i].ymax=spt[i].y;
			edge[i].xmax=(float)spt[i].x;
			edge[i].xmin=(float)spt[i+1].x;

			if(pmax<spt[i].y)pmax=spt[i].y;
			if(pmin>spt[i+i].y)pmin=spt[i+1].y;
		}
	}//END FOR

/*===================
//edge[0]--edge[5] 6边
//
====================*/
	
	//r=0 ->qmax=5,q+1=6
	for(int r=1;r<6;r++)						//排序edge
	{
		for(int q=0;q<6-r;q++)
		{
			if(edge[q].ymin<edge[q+1].ymin)		//ymin最小的将被送到最后
			{
				newedge[0]=edge[q];
				edge[q]=edge[q+1];
				edge[q+1]=newedge[0];
			}
		}
	}//for r

/*==================================
//	edge[0]--edge[5] ymin递减序 越后的越靠上
(2,3)
|
|
|
|
|
\
(2 ,9)
	\
	  \
		\
		(7,11)
//ymin 在最上方,ymax在最下方

//为了表示点,所以开始选择越上y越小
====================================*/

	for(int scan=pmax-1;scan>=pmin+1;scan--)		//pmax->pmin行扫描
	{
		int b=0;

		for(int j=s;j<6;j++)						//s记录随着Scan往上,不再相交的edge
		{
			if((scan>edge[j].ymin)&&(scan<=edge[j].ymax))//判断扫描线与线段相交
			{
				if(scan==edge[j].ymax)
				{
					if(spt[edge[j].num+1].y<edge[j].ymax)
					{
						b++;
						p[b]=(int)edge[j].xmax;
					}
					if(spt[edge[j].num-1].y<edge[j].ymax)
					{
						b++;		
						p[b]=(int)edge[j].xmax;
					}			
				}			
				 //if((scan>edge[j].ymin)&&(scan<edge[j].ymax))
				else
				{
					b++;
					p[b]=(int)(edge[j].xmax+edge[j].dx*(scan-edge[j].ymax));
				}
			}//end if

			if(scan<=edge[j].ymin)//当扫描线scan低于edge时,s=j
				s=j;
			
		}//for(j=k;j<6;j++)

		if(b>1)
		{
			for(int u=1;u<b;u+=2)
			{
				pDC->MoveTo(p[u],scan);
				pDC->LineTo(p[u+1],scan);
			}
			Sleep(1);
		}
	}
	pDC->SelectObject(old);	
}
Beispiel #16
0
void plot(void)
{
   int c;
   int w, n, xmin, ymin, xmax, ymax;
   int x0, y0, r1, r2, arg1, arg2;

   while ((c = getchar()) != EOF) {
      switch (c) {
      case 'M':
         scanf("%d %d", &pb.x, &pb.y);
         _move(pb.x, pb.y);
         break;
      case 'D':
         _line();
         break;
      case '%':
         scanf("%d", &n);
         hatching(n);
         break;
         /*    polyg(n);    break;
          */
      case 'P':
         get_str();
         break;
      case 'S':
         scanf("%d", &ch);
         break;
      case 'Q':
         scanf("%d", &cw);
         break;
      case 'R':
         scanf("%d", &th);
         th = (th == 0) ? 0 : 1;
         break;
      case 'L':
         scanf("%d", &w);
         line_type(w);
         break;
      case 'K':
         scanf("%d", &w);
         join_type(w);
         break;
      case 'W':
         scanf("%d %d %d %d %d %d", &x0, &y0, &r1, &r2, &arg1, &arg2);
         circle(x0, y0, r1, r2, arg1, arg2);
         break;
      case 'N':
         scanf("%d", &w);
         mark(w);
         break;
      case 'J':
         scanf("%d", &w);
         newpen(w);
         break;
      case '\\':
         scanf("%d %d", &xmin, &ymin);
         break;
      case 'Z':
         scanf("%d %d", &xmax, &ymax);
         if (!landscape) {
            if (xmax > XLENG)
               xmax = XLENG;
            if (ymax > YLENG)
               ymax = YLENG;
         } else {
            if (xmax > YLENG)
               xmax = YLENG;
            if (ymax > XLENG)
               ymax = XLENG;
         }
         clip(normx(xmin), normy(ymax), normx(xmax), normy(ymin));
         break;
      case ';':
      case ':':
         break;
      default:
         break;
      }
   }
}
Beispiel #17
0
void atari(void){//当たり判定
  //----------------四角の当たり判定-------------------
  for(i=0; i<kosu; i++){//通常の四角
    if(
       ( (x > x_sq[i] && x < x_sq[i]+w_sq[i]) &&
	 (25 > y_sq[i]-5 && 25 < y_sq[i]+h_sq[i]+5) ) ||
       
       ( (x_sq[i]-5 < x && x < x_sq[i]+w_sq[i]+5) &&
	 (y_sq[i] < 25 && 25 < y_sq[i]+h_sq[i]) ) ||
       
       ( (x_sq[i]-x)*(x_sq[i]-x)+
	 (y_sq[i]+w_sq[i]-25)*(y_sq[i]+w_sq[i]-25) < 25) ||
       
       ( (x_sq[i]+w_sq[i]-x)*(x_sq[i]+w_sq[i]-x)+
	 (y_sq[i]+h_sq[i]-25)*(y_sq[i]+h_sq[i]-25) < 25 ) 
       ){
      gclr(win);
      newpen(win, 1);
      drawstr(win, 150, 250, 24, 0.0, "GAMEOVER");
      msleep(time*30);
      exit(0);
    }  
  }
  //------------------ここまで---------------------
  
  //----------------丸の当たり判定--------------------
  for(i=0; i<kosu; i++){//通常の円
    if( (r_circ[i]+5)*(r_circ[i]+5) >
	(x-x_circ[i])*(x-x_circ[i])+(25-y_circ[i])*(25-y_circ[i]) ){
      gclr(win);
      newpen(win, 1);
      drawstr(win, 150, 250, 24, 0.0, "GAMEOVER");
      msleep(time*30);
      exit(0);	 
    }
  }
  
  //--------------ここまで-------------------------
  
  if(//左の四角
     ( (x > defence_x && x < defence_x+defence_w) &&
       (25 > defence_y-5 && 25 < defence_y+defence_h1+5) ) ||
     
     ( (defence_x-5 < x && x < defence_x+defence_w+5) &&
       (defence_y < 25 && 25 < defence_y+defence_h1) ) ||
     
     ( (defence_x-x)*(defence_x-x)+(defence_y-25)*(defence_y-25)
       < 25 ) ||
     
     ( (defence_x-x)*(defence_x-x)+
       (defence_y+defence_h1-25)*(defence_y+defence_h1-25) < 25 ) ||
     
     ( (defence_x+defence_w-x)*(defence_x+defence_w-x)+
       (defence_y-25)*(defence_y-25) < 25 ) ||
     
     ( (defence_x+defence_w-x)*(defence_x+defence_w-x)+
       (defence_y+defence_h1-25)*(defence_y+defence_h1-25) < 25 )
     ){
    gclr(win);
    newpen(win, 1);
    drawstr(win, 150, 250, 24, 0.0, "GAMEOVER");
    msleep(time*30);
    exit(0);
  } 
  
  if(//真ん中の四角
     ( (x > defence_x+40 && x < defence_x+40+defence_w) &&
       (25 > defence_y+60-5 && 25 < defence_y+60+defence_h2+5) ) ||
     
     ( (defence_x+40-5 < x && x < defence_x+40+defence_w+5) &&
       (defence_y+60 < 25 && 25 < defence_y+60+defence_h2) ) ||
     
     ( (defence_x+40-x)*(defence_x+40-x)+
       (defence_y+60-25)*(defence_y+60-25) < 25 ) ||
     
     ( (defence_x+40-x)*(defence_x+40-x)+
       (defence_y+60+defence_h2-25)*(defence_y+60+defence_h2-25)
       < 25 ) ||
     
     ( (defence_x+40+defence_w-x)*(defence_x+40+defence_w-x)+
       (defence_y+60-25)*(defence_y+60-25) < 25 ) ||
     
     ( (defence_x+40+defence_w-x)*(defence_x+40+defence_w-x)+
       (defence_y+60+defence_h2-25)*(defence_y+60+defence_h2-25)
       < 25 )
     ){
    gclr(win);
    newpen(win, 1);
    drawstr(win, 150, 250, 24, 0.0, "GAMEOVER");
    msleep(time*30);
    exit(0);
  } 
  
  if(//右の四角
     ( (x > defence_x+80 && x < defence_x+80+defence_w) &&
       (25 > defence_y-5 && 25 < defence_y+defence_h3+5) ) ||
     
     ( (defence_x+80-5 < x && x < defence_x+80+defence_w+5) &&
       (defence_y < 25 && 25 < defence_y+defence_h3) ) ||
     
     ( (defence_x+80-x)*(defence_x+80-x)+
       (defence_y-25)*(defence_y-25) < 25 ) ||
     
     ( (defence_x+80-x)*(defence_x+80-x)+
       (defence_y+defence_h3-25)*(defence_y+defence_h3-25) < 25 ) ||
     
     ( (defence_x+80+defence_w-x)*(defence_x+80+defence_w-x)+
       (defence_y-25)*(defence_y-25) < 25 ) ||
     
     ( (defence_x+80+defence_w-x)*(defence_x+80+defence_w-x)+
       (defence_y+defence_h3-25)*(defence_y+defence_h3-25) < 25 )
     ){
    gclr(win);
    newpen(win, 1);
    drawstr(win, 150, 250, 24, 0.0, "GAMEOVER");
    msleep(time*30);
    exit(0);
  } 
}
Beispiel #18
0
void bougoheki(void){//防護壁の表記
  newpen(win,1);
  fillrect(win,defence_x, 0.0, defence_w, defence_h1);
  fillrect(win,defence_x+40.0, 60.0, defence_w, defence_h2);
  fillrect(win,defence_x+80.0, 0.0, defence_w, defence_h3);
}
Beispiel #19
0
int main()
{
    int i,j,key,sl=0,wl=1 ;
    int shape_i = 11, shape_j = 4 ;
    float f=MRATIO_F ;
    float x,y,zx,zy,z,ph,ms_w,ms_h ;
    float zran=(ZMAX-ZMIN) ;
    float zcen=(ZMAX+ZMIN)/2.0 ;
    color_prms cl = {
	EGGX_COLOR_BEGIN,			/* カラーパターン */
	CP_CONTRAST | CP_BRIGHTNESS | CP_GAMMA,	/* フラグ */
	1.0,					/* コントラスト */
	0.0,					/* ブライトネス*/
	1.0,					/* γ */
    } ;
    int win ;
    int cl_r,cl_g,cl_b ;

    win=gopen(WINWIDTH,WINHEIGHT) ;	/* ウィンドゥのタイトル */
    /* 座標系を変更する */
    coordinate(win, 0,0, XMIN,YMIN, 
	       WINWIDTH/(XMAX-XMIN), WINHEIGHT/(YMAX-YMIN)) ;
    layer(win,sl,wl) ;

    puts("【キーボードでの操作方法】") ;
    puts("'PageUp','PageDown'  … 質量比変更") ;
    puts("'c','C'              … カラーパターン") ;
    puts("'↑','↓','←','→'  … カラー調整") ;
    puts("'[',']'              … コントラスト") ;
    puts("'{','}'              … ブライトネス") ;
    puts("'<','>'              … γ補正") ;
    puts("'s'                  … 画像を保存") ;
    puts("'q','Esc'            … 終了") ;

    ms_w=(float)(XMAX-XMIN)/XSAMPLES ;	/* メッシュ1個分のサイズ */
    ms_h=(float)(YMAX-YMIN)/YSAMPLES ;

    do{
	/* ウィンドゥのタイトル */
	winname(win,"ロッシュワールド('s'キーで画像save) f=%g zcen=%g zran=%g",
		f,zcen,zran) ;
	for( i=0 ; i<XSAMPLES ; i++ ){	/* ポテンシャルを色で表現 */
	    x=XMIN+ms_w*i ;
	    for( j=0 ; j<YSAMPLES ; j++ ){
		y=YMIN+ms_h*j ;
		ph=get_phi(x+ms_w/2.0,y+ms_w/2.0,f) ;
		generatecolor(&cl,zcen-zran/2,zcen+zran/2,ph,
			      &cl_r,&cl_g,&cl_b) ;
		newrgbcolor(win,cl_r,cl_g,cl_b) ;
		fillrect(win,x,y,ms_w*1.5,ms_h*1.5) ;
	    }
	}
	newpen(win,1) ;
	for( i=0 ; i<XSAMPLES ; i++ ){	/* テスト粒子に働く力を矢印で表現 */
	    x=XMIN+ms_w*(i+0.5) ;
	    for( j=0 ; j<YSAMPLES ; j++ ){
		y=YMIN+ms_h*(j+0.5) ;
		zx=get_fx(x,y,f) ;
		zy=get_fy(x,y,f) ;
		zx *= VXSCALE ;
		zy *= VYSCALE ;
		z=sqrt(zx*zx+zy*zy) ;
		if( z <= VCARMAX ){
		    drawarrow(win,x-zx,y-zy,x+zx,y+zy,0.3,0.2,
			      shape_i*10+shape_j) ;
		}
	    }
	}
	sl ^= 1 ;				/* XORをとってレイヤを切替 */
	wl ^= 1 ;
	layer( win,sl,wl ) ;
	key=ggetch() ;				/* キー入力があるまで待つ */
	if( key == 0x002 ) f += 0.1 ;		/* PageUp */
	else if( key == 0x006 ) f -= 0.1 ;	/* PageDown */
	else if( key == 0x01e ) zcen += 0.1 ;	/* ↑ */
	else if( key == 0x01f ) zcen -= 0.1 ;	/* ↓ */
	else if( key == 0x01c ) zran += 0.1 ;	/* → */
	else if( key == 0x01d ) zran -= 0.1 ;	/* ← */
	else if( key == 'i' ) {
	    shape_i += 1 ;
	    if ( 12 < shape_i ) shape_i = 10 ;
	}
	else if( key == 'j' ) {
	    shape_j += 1 ;
	    if ( 7 < shape_j ) shape_j = 1 ;
	}
	else if( key == 'c' ){			/* 'c','C'キーでカラーパターン変更 */
	    cl.colormode++ ;
	    if( EGGX_COLOR_BEGIN+EGGX_COLOR_NUM <= cl.colormode )
		cl.colormode=EGGX_COLOR_BEGIN ;
	}
	else if( key == 'C' ){
	    cl.colormode-- ;
	    if( cl.colormode < EGGX_COLOR_BEGIN )
		cl.colormode=EGGX_COLOR_BEGIN+EGGX_COLOR_NUM-1 ;
	}
	else if( key == '[' ){			/* '[',']'でコントラスト変更 */
	    cl.contrast += 0.05 ;
	    if( 1 < cl.contrast ) cl.contrast = 1 ;
	}
	else if( key == ']' ){
	    cl.contrast -= 0.05 ;
	    if( cl.contrast < 0 ) cl.contrast = 0 ;
	}
	else if( key == '{' ){			/* '{','}'でブライトネス変更 */
	    cl.brightness += 0.05 ;
	    if( 1 < cl.brightness ) cl.brightness = 1 ;
	}
	else if( key == '}' ){
	    cl.brightness -= 0.05 ;
	    if( cl.brightness < 0 ) cl.brightness = 0 ;
	}
	else if( key == '<' ){			/* '<','>'でγ変更 */
	    cl.gamma += 0.025 ;
	}
	else if( key == '>' ){
	    cl.gamma -= 0.025 ;
	    if( cl.gamma <= 0 ) cl.gamma = 0.025 ;
	}
	else if( key == 's' ){			/* 's'キーで保存 */
#ifdef USE_NETPBM
	    saveimg( win,sl,XMIN,YMIN,XMAX,YMAX,
		     "pnmtops -noturn -dpi 72 -equalpixels -psfilter -flate -ascii85",256,
		     "roche_f=%g.eps",f) ;
	    printf("画像を保存: filename='roche_f=%g.eps'\n",f) ;
#else
#ifdef USE_IMAGEMAGICK
	    saveimg( win,sl,XMIN,YMIN,XMAX,YMAX,"convert",256,
		     "roche_f=%g.png",f) ;
	    printf("画像を保存: filename='roche_f=%g.png'\n",f) ;
#else
	    saveimg( win,sl,XMIN,YMIN,XMAX,YMAX,"",256,
		     "roche_f=%g.ppm",f) ;
	    printf("画像を保存: filename='roche_f=%g.ppm'\n",f) ;
#endif
#endif
	}
	if( f < 0 ) f=0 ;
	if( zran < 0 ) zran=0.1 ;
    } while( key != 0x01b && key != 'q' ) ;	/* ESCキーか 'q'キーで終了 */

    gcloseall() ;
    return(0) ;
}
Beispiel #20
0
int main(){
  int a, i;//カウンタ変数
  int phase[MAXNUMBER];//波の位相の配列
  int color[MAXNUMBER];//波の色の配列
  int droparray[MAXNUMBER];//落ちる水滴の配列
  float x;//円の中心x座標
  float y;//円の中心y座標
  float r[MAXNUMBER];//円の半径の配列
  float scale;//減衰のための係数
  float phasescale;//位相の減衰係数
  float sum;//波を足し合わせる関数
  int count;//カウント変数
  int offset;//波の相殺
  int flag;//フラグ変数

  win=gopen(800,800);/*画面表示*/
  winname(win,"final");/*題名*/
  phasescale = 0.25;
  flag = 0;

  /*水滴の描画*/
  for(a=0; a<=1; a++){
    for(i=0; i<=150; i++){
      background();//背景を描く関数
      if(a==1){
	newpen(win , 1);
	fillcirc(win, 270, 610, 6, 6);	/*葉っぱの先の水滴を描く*/
      }
      branch();//木の幹を書く関数
      rightleaf();//上側の葉っぱを描く関数
      underleaf();//下側の葉っぱを描く関数
      mainleaf();//メインの葉っぱを描く関数
      surfacewater();//水面を描く関数
      newpen(win, 1);
      fillcirc(win, 426-i, 761-i, 5, 5);  /*葉っぱの初期移動*/
      msleep(50);
    }
  }
  
  /*波の初期設定*/
  for(i=0; i < MAXNUMBER; i++){
    color[i] = 128;
    phase[i] = -1;
    droparray[i]=-1;
    r[i]=(MAXLENGTH / MAXNUMBER) * i;//円の半径初期化
  }

  x=300.0;
  y=300.0;
  
  layer(win, 0, 1); /*表示は 0 番、描画は 1 番レイヤーで*/
  /*波が非同期に落ちる*/
  while(1){
    background();//背景を描く関数
    /*葉っぱの先の水滴を描く*/
    newpen(win , 1);
    fillcirc(win, 270, 610, 6, 6);
    branch();//木の幹を描く関数
    rightleaf();//上側の葉っぱを描く関数
    underleaf();//下側の葉っぱを描く関数
    mainleaf();//メインの葉っぱを描く関数
    surfacewater();//水面を描く関数

    /*初期化*/
    color[0] = 0;
    sum = 0;
    count = 0;

    for(i=0; i < MAXNUMBER; i++){
      if(phase[i] >= 200){
	phase[i] = -1;
	flag = 1;
      }
      if(phase[i] != -1){
	scale = (MAXNUMBER - phase[i])*0.01;
	sum += 128*(sin(ENSHUU/MAXNUMBER-phasescale*phase[i])*scale);
	count++;
	msleep(3);
      }
    }
    
    if(count > 0){
      color[0] = sum / count + 128 - offset;
      if(flag == 1){
	offset += color[0] - color[1];
	flag = 0;
      } 
      if(offset > 0){
	offset--;
      }else if(offset < 0){
	offset++;
      }
    }


    if(color[0] == 0 || color[0] >= 255 ){
      color[0] = 128;
    }

    for(i=MAXNUMBER-1; i>0; i--){
      color[i]=color[i-1];
    }

    for(i=MAXNUMBER-1; i>=0; i--) {
      if( r[i] > 0.0 ) {
	newhsvcolor(win, 200, color[i], 255);
	fillcirc(win, x, y, r[i], r[i]); 
      }
    }

    if(drop(droparray) == 1){
      for(i=0; i<MAXNUMBER; i++){
	if(phase[i] == -1){
	  phase[i] = 0;
	  break;
	}
      }
    }

    for(i=0; i<=MAXNUMBER; i++){
      if(phase[i] != -1){
	phase[i]++;
      }
    }
    copylayer(win, 1, 0); /*レイヤー 1 番の内容を 0 にコピー*/
    msleep(40);
  }

  gclose(win);/*つける必要はないですけど開いたら閉じたかったのでつけました*/
 
 
  return 0;
}