计算机图形学中的正方形对称变换算法c++程序实现

这个就是根据一个公式,写一个函数,通过这个函数,直接得到图形相对于对称直线的对称点,然后连接球出来的对称点就可以了

 

#include<iostream>
#include<conio.h>
#include<stdio.h>
#include<graphics.h>
using namespace std;

int X1 = 500 ;
int Y1 = 50;
int X2 = 50;
int Y2 = 500 ;

void MidpointLine(int x1,int y1,int x2,int y2,int color)  //中点画线法
{
 int x = x1, y = y1; //初始化x,y
 int a = y1 - y2, b = x2 - x1;      //a,b分别为x和y的增量
 //考虑四种情况,分别计算增量
 int deltx = (b >= 0 ? 1 : (b = -b, -1)); 
 int delty = (a <= 0 ? 1 : (a = -a, -1));

 putpixel(x, y, color);

 int d, delt1, delt2;
 if (-a <= b)  // 斜率绝对值 <= 1
 {
  d = 2 * a + b;
  delt1 = 2 * a;
  delt2 = 2 * (a + b);
  while(x != x2)
  {
   if (d < 0)
    y += delty, d += delt2;
   else
    d += delt1;
   x += deltx;
   putpixel(x, y, color);
  }
 }
 else    // 斜率绝对值 > 1
 {
  d = 2 * b + a;
  delt1 = 2 * b;
  delt2 = 2 * (a + b);
  while(y != y2)
  {
   if(d < 0)
    d += delt1;
   else
    x += deltx, d += delt2;
   y += delty;
   putpixel(x, y, color);
  }
 }
}

void SymmetricPoint(int x1,int y1,int x2,int y2,int px,int py,int* symmetricX,int* symmetricY)
{
 float A = (y1-y2);
 float B = (x2-x1);
 float C = x1*y2-x2*y1;
 float D = (A*px+B*py+C)/(A*A+B*B) ;
 int x = int(double(px) - 2.0*A*D) ;
 int y = int(double(py) - 2.0*B*D) ;
 *symmetricX = x ;
 *symmetricY = y ;
}

int main()
{

  initgraph(1000,800);

  //画对称线
  MidpointLine(X1,Y1,X2,Y2,255);
  //用来保存对称点
  int symmetricX;
  int symmetricY;
  int square[4][4];
  //画正方形
  MidpointLine(100,400,200,400,255);
     MidpointLine(200,400,200,500,255);
  MidpointLine(200,500,100,500,255);
  MidpointLine(100,500,100,400,255);
 

  //求出所有对称点
  SymmetricPoint(X1,Y1,X2,Y2,100,400,& symmetricX,& symmetricY);
  square[0][0]=symmetricX;
  square[0][1]=symmetricY;

  SymmetricPoint(X1,Y1,X2,Y2,200,400,& symmetricX,& symmetricY);
  square[1][0]=symmetricX;
  square[1][1]=symmetricY;

  SymmetricPoint(X1,Y1,X2,Y2,200,500,& symmetricX,& symmetricY);
  square[2][0]=symmetricX;
  square[2][1]=symmetricY;

  SymmetricPoint(X1,Y1,X2,Y2,100,500,& symmetricX,& symmetricY);
  square[3][0]=symmetricX;
  square[3][1]=symmetricY;


  //按照对称点画图
  MidpointLine(square[0][0],square[0][1],square[1][0],square[1][1],255);
  MidpointLine(square[1][0],square[1][1],square[2][0],square[2][1],255);
  MidpointLine(square[2][0],square[2][1],square[3][0],square[3][1],255);
  MidpointLine(square[3][0],square[3][1],square[0][0],square[0][1],255);

  getch();
  return 0;
}

 

posted @ 2016-06-06 13:26  晓风飞雨  阅读(1132)  评论(0)    收藏  举报