二维图形变换

简介: 例程1#include #include "AFFINE.C"main(){  int driver=DETECT,mode;  static double x1[]={0.0,10.0,100.0,110.

例程1
#include <graphics.h>
#include "AFFINE.C"
main()
{
  int driver=DETECT,mode;
  static double x1[]={0.0,10.0,100.0,110.0,0.0};
  static double y1[]={0.0,50.0,50.0,-10.0,0.0};
  static double x2[5],y2[5];
  int i;
  double x,xx,yy;
  initgraph(&driver,&mode," ");
  axis();
  for (x=-300;x<=200;x=x+10)
  {
    parallel(x,x/2);
    for (i=0;i<=4;i++)
    {
      x2[i]=affinex(x1[i],y1[i],1.0);
      y2[i]=affiney(x1[i],y1[i],1.0)/2;
    }
    for (i=0;i<=3;i++)
    {
      line(scx(x2[i]),scy(y2[i]),scx(x2[i+1]),scy(y2[i+1]));
    }
  }
  getch();
  closegraph();
}


例程2
#include <graphics.h>
#include "affine.c"

main()
{
  int graphdriver=DETECT,graphmode;
  static double x1[]={0.0,10.0,100.0,110.0,0.0};
  static double y1[]={0.0,50.0,50.0,0.0,0.0};
  static double x2[5],y2[5];
  int i;
  double r,xx,yy;
  initgraph(&graphdriver,&graphmode,"");
  for (r=0;r<=360;r+=10)
  {
    rotate(r);
    for (i=0;i<=4;i++)
    {
      x2[i]=affinex(x1[i],y1[i],1.0);
      y2[i]=affiney(x1[i],y1[i],1.0)/2;
    }

    for (i=0;i<=3;i++)
    {
      line(scx(x2[i]),scy(y2[i]),scx(x2[i+1]),scy(y2[i+1]));
    }
  }
  getch();
  closegraph();
}

例程3
#include <graphics.h>
#include <math.h>
#include "affine.c"

main()
{
  int driver=DETECT,mode;
  static double x1[]={-20.0,0.0,30.0,10.0,-20.0};
  static double y1[]={0.0,17.0,-10.0,-20.0,0.0};
  static double x2[5],y2[5];
  int i;
  double r;
  initgraph(&driver,&mode,"");
  axis();
  for (r=0;r<=360;r+=10)
  {
    rotate(r);
    for (i=0;i<=4;i++)
    {
      x2[i]=affinex(x1[i],y1[i],1.0);
      y2[i]=affiney(x1[i],y1[i],1.0);
    }
    parallel(cos(r/180*3.1415926)*150.0,sin(r/180*3.1415926)*100.0);
    for (i=0;i<=4;i++)
    {
      x2[i]=affinex(x2[i],y2[i],1.0);
      y2[i]=affiney(x2[i],y2[i],1.0);
      line(scx(x2[i]),scy(y2[i]),scx(x2[i+1]),scy(y2[i+1]));
    }
    for (i=0;i<=3;i++)
    {
      line(scx(x2[i]),scy(y2[i]),scx(x2[i+1]),scy(y2[i+1]));
    }
  }
  getch();
  closegraph();
}


其中用到的affine.c
double sin(),cos();
double xmax=639.0,ymax=399.0;
double f[3][3],xx,yy;

scx(xj)      //将实际的x坐标转换为屏幕坐标
double xj;
{
  int x;
  x=(int)(xj+xmax/2);
  return x;
}

scy(yi)     //将实际的y坐标转换为屏幕坐标
double yi;
{
  int y;
  y=ymax-(int)(yi+(ymax/2));
  return y;
}

parallel(dx,dy)   //完成平移变换,dx,dy分别为x轴方向和y轴方向的平移量
double dx,dy;
{
  f[0][0]=1.0;  f[0][1]=0.0;   f[0][2]=0.0;
  f[1][0]=0.0;  f[0][1]=1.0;   f[1][2]=0.0;
  f[2][0]=dx;   f[2][1]=dy;    f[2][2]=1.0;
}

rotate(theta)    //以原点为中心的旋转变换,旋转角度为theta
double theta;
{
  double th;
  th=theta/180*3.1415926;
  f[0][0]=cos(th); f[0][1]=sin(th);
  f[0][2]=0.0;  f[1][0]=-sin(th);
  f[1][1]=cos(th); f[1][2]=0.0;
  f[2][0]=0.0;  f[2][1]=0.0;  f[2][2]=1.0;
}

scale(s)
double s;   //比例变换,比例系数为s
{
  f[0][0]=s;  f[0][1]=0.0;   f[0][2]=0.0;
  f[1][0]=0.0;  f[1][1]=s;   f[1][2]=0.0;
  f[2][0]=0.0;   f[2][1]=0.0;    f[2][2]=1.0;
}

taisho_x()   //对称变换,对称轴为x
{
  f[0][0]=1.0;  f[0][1]=0.0;    f[0][2]=0.0;
  f[1][0]=0.0;  f[1][1]=-1.0;   f[1][2]=0.0;
  f[2][0]=0.0;   f[2][1]=0.0;   f[2][2]=1.0;
}

taisho_y()    //对称变换,对称轴为y
{
  f[0][0]=-1.0;  f[0][1]=0.0;    f[0][2]=0.0;
  f[1][0]=0.0;  f[1][1]=-1.0;   f[1][2]=0.0;
  f[2][0]=0.0;   f[2][1]=0.0;   f[2][2]=1.0;
}

taisho_o()   //对称变换,对称轴为原点

{
  f[0][0]=-1.0;  f[0][1]=1.0;    f[0][2]=0.0;
  f[1][0]=0.0;  f[1][1]=-1.0;   f[1][2]=0.0;
  f[2][0]=0.0;   f[2][1]=0.0;   f[2][2]=1.0;
}

taisho_xy()    //对称变换,对称轴为x=y
{
  f[0][0]=0.0;  f[0][1]=1.0;    f[0][2]=0.0;
  f[1][0]=1.0;  f[1][1]=0.0;   f[1][2]=0.0;
  f[2][0]=0.0;   f[2][1]=0.0;   f[2][2]=1.0;
}

taishl(aa,bb,cc)    //对称变换,对称轴为任意直线

{
  float y,p;
  y=bb*bb-aa*aa;
  p=aa*aa+bb*bb;
  f[0][0]=-y/p; f[0][1]=-2*aa*bb/p;    f[0][2]=0.0;
  f[1][0]=-2*aa*bb/p;  f[1][1]=-y/p;   f[1][2]=0.0;
  f[2][0]=-2*aa*cc/p;   f[2][1]=-2*bb*cc/p;   f[2][2]=1.0;
}

axis()     //坐标变换为屏幕中心为原点,座和上分别为x轴和y轴的正方向
{
  line(scx(0),scy(-ymax/2),scx(0),scy(ymax/2));
  line(scx(-xmax),scy(0,0),scx(xmax/2),scy(0.0));
}

tuoq(a,b)
double a,b;
{
  f[0][0]=1.0; f[0][1]=b;    f[0][2]=0.0;
  f[1][0]=a;  f[1][1]=1.0;   f[1][2]=0.0;
  f[2][0]=0.0;   f[2][1]=0.0;   f[2][2]=1.0;
}

affinex(x,y,d)  
double x,y,d;
{
  xx=x*f[0][0]+y*f[1][0]+d*f[2][0];
  return(xx);
}

affiney(x,y,d)   //图形元素与矩阵元素相乘
double x,y,d;
{
  yy=x*f[0][1]+y*f[1][1]+d*f[2][1];
  return(yy);
}

相关文章
|
编解码 物联网
LDPC 码在 3GPP 中的应用 | 带你读《5G-NR信道编码》之十八
本章节带你了解LDPC 码在 3GPP 中的应用。
LDPC 码在 3GPP 中的应用  | 带你读《5G-NR信道编码》之十八
|
开发者 索引
MatchAllQuery|学习笔记
快速学习 MatchAllQuery。
194 0
|
JSON Java 数据格式
[Spring cloud 一步步实现广告系统] 4. 通用代码模块设计
一个大的系统,在代码的复用肯定是必不可少的,它能解决: 统一的响应处理(可以对外提供统一的响应对象包装) graph LR HTTP-->|HttpRequest|RestController RestController-->|HttpResponse -> JSON|HTTP 统一...
1242 0
|
Java Unix Android开发
Java NIO中的Glob模式详解
版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/46482571 Java NIO中的Glob模式详解 作者:chszs,转载需注明。
1229 0
|
3天前
|
弹性计算 运维 搜索推荐
三翼鸟携手阿里云ECS g9i:智慧家庭场景的效能革命与未来生活新范式
三翼鸟是海尔智家旗下全球首个智慧家庭场景品牌,致力于提供覆盖衣、食、住、娱的一站式全场景解决方案。截至2025年,服务近1亿家庭,连接设备超5000万台。面对高并发、低延迟与稳定性挑战,全面升级为阿里云ECS g9i实例,实现连接能力提升40%、故障率下降90%、响应速度提升至120ms以内,成本降低20%,推动智慧家庭体验全面跃迁。
|
4天前
|
数据采集 人工智能 自然语言处理
3分钟采集134篇AI文章!深度解析如何通过云无影AgentBay实现25倍并发 + LlamaIndex智能推荐
结合阿里云无影 AgentBay 云端并发采集与 LlamaIndex 智能分析,3分钟高效抓取134篇 AI Agent 文章,实现 AI 推荐、智能问答与知识沉淀,打造从数据获取到价值提炼的完整闭环。
366 91
|
4天前
|
SQL 人工智能 自然语言处理
Geo优化SOP标准化:于磊老师的“人性化Geo”体系如何助力企业获客提效46%
随着生成式AI的普及,Geo优化(Generative Engine Optimization)已成为企业获客的新战场。然而,缺乏标准化流程(Geo优化sop)导致优化效果参差不齐。本文将深入探讨Geo专家于磊老师提出的“人性化Geo”优化体系,并展示Geo优化sop标准化如何帮助企业实现获客效率提升46%的惊人效果,为企业在AI时代构建稳定的流量护城河。
382 156
Geo优化SOP标准化:于磊老师的“人性化Geo”体系如何助力企业获客提效46%