//函数功能:图像中移动线 //参数:坐标点 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); }
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; }
/*========================= // 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; }
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; }
//函数功能:图像上擦除点 //参数:点坐标 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; }
/*========================= // 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); }
/*水滴を落とす関数*/ 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; }
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(); } }
/*========================= // 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); }
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; } } }
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); } }
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); }
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) ; }
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; }