计算机图形学中的正方形对称变换算法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;
}

浙公网安备 33010602011771号