跳至内容

分形/计算机图形技术/2D/平面

来自维基教科书,开放世界中的开放书籍

2D平面直接链接

  • 欧几里得[1]
  • 非欧几里得[2]
    • 双曲
    • 椭圆
欧几里得几何与非欧几里得几何之间的区别:在三种类型的几何中,具有共同垂直线的直线的行为


图像几何质量

  • 良好(无失真)
  • 不良(失真)

可视化

[编辑 | 编辑源代码]

视窗(平面的可见部分)

[编辑 | 编辑源代码]

视窗是计算机图形学中的多边形查看区域。[3]

2D平面的矩形部分可以通过 来描述

  • 角点(4个实数或2个复数 = 2D点)
  • 中心和 
    • 宽度(3个实数)
    • 放大倍数
    • 半径

"人们以多种方式指定分形坐标。有些人使用可见点左上角和右下角的坐标,将坐标指定为四个数字 x1、y1、x2、y2。要在 XaoS 中设置相同的视点,将中心的实部设置为 (x1+x2)/2,中心的虚部设置为 (y1+y2)/2,半径设置为 x2-x1 和 y2-y1 中较大的一个。"(来自XaoS 文档[4]

Fractint、Ultra Fractal、ChaosPro 和 Fractal Explorer 中的标准描述是角点。例如,曼德博集合的初始平面为

 Corners:                X                     Y
 Top-l          -2.5000000000000000    1.5000000000000000
 Bot-r           1.5000000000000000   -1.5000000000000000
 Ctr -0.5000000000000000   0.0000000000000000  Mag 6.66666667e-01
 X-Mag-Factor     1.0000   Rotation    0.000   Skew    0.000

参数平面的显示窗口具有 

  • 4 的水平宽度(实部)
  • 3 的垂直宽度(高度)(虚部)
  • 4/3 的纵横比(比例)(同样在像素中为 640/480,因此没有失真)
  • 中心 z=-0.5

参见演示 par 文件 

Mandel_Demo        { ; PAR for initialization of Fractint demo
  reset=1900 type=mandel corners=-2.5/1.5/-1.5/1.5 params=0/0 inside=0
  sound=no
  }

对于朱利亚集/动态平面,有 

Corners:                X                     Y
Top-l          -2.0000000000000000    1.5000000000000000
Bot-r           2.0000000000000000   -1.5000000000000000
Ctr  0.0000000000000000   0.0000000000000000  Mag 6.66666667e-01
X-Mag-Factor     1.0000   Rotation    0.000   Skew    0.000

Fractint 文档中的描述 

CORNERS=[xmin/xmax/ymin/ymax[/x3rd/y3rd]]

示例:corners=-0.739/-0.736/0.288/0.291

以这些坐标作为 x 和 y 坐标的范围开始,而不是默认值(对于 type=mandel) -2.0/2.0/-1.5/1.5。当您指定四个值(通常的情况)时,这定义了一个矩形:x 坐标映射到屏幕,从左到右,从 xmin 到 xmax,y 坐标映射到屏幕,从下到上,从 ymin 到 ymax。六个参数可用于描述任何旋转或拉伸的平行四边形:(xmin,ymax)用于屏幕左上角的坐标,(xmax,ymin)用于右下角的坐标,(x3rd,y3rd)用于左下角的坐标。仅输入“CORNERS=”会告诉 Fractint 使用此形式(默认模式),而不是 CENTER-MAG(见下文)在使用 [B] 命令保存参数时。


int SetPlaneFromCorners(double CxMin , double CxMax, double CyMin , double CyMax){
  
  
  
  Radius = fabs(CyMax-CyMin)/2.0;
  Magnification = 1.0/Radius;
  
  // http://www.purplemath.com/modules/midpoint.htm
  Center = (CxMax+CxMin)/2.0 + I*(CyMax+CyMin)/2.0;
  
    
  return 0; 
 


}

中心和...

[编辑 | 编辑源代码]
 "If you use the center, you can change the zoom level and the plot zooms in/out smoothly on the same center point. " Duncan C). 

放大倍数

[编辑 | 编辑源代码]

Fractint 使用 Mag(与 Xmagfactor 相比)

 CENTER-MAG=[Xctr/Yctr/Mag[/Xmagfactor/Rotation/Skew]]

这是一种将角点作为中心点和放大倍数输入的替代方法,在一些分形程序和出版物中很受欢迎。仅输入 "CENTER-MAG=" 会告诉 Fractint 使用此形式,而不是 CORNERS(见上文)在使用 [B] 命令保存参数时。[TAB] 状态显示显示了两种形式的“角点”。当您指定三个值(通常的情况)时,这定义了一个矩形:(Xctr,Yctr)指定图像中心的坐标。

Mag 指示要使用的放大倍数。初始值(无缩放)为 6.66666667e-01。

六个参数可用于描述任何旋转或拉伸的平行四边形:Xmagfactor 指示 x 放大倍数比 y 放大倍数大多少倍,

Rotation 指示图像旋转了多少度。

Skew 指示图像倾斜了多少度。正角度将逆时针旋转和倾斜图像。

参数可以保存到称为 fractint.par 的parmfile

Wolf Jung 在Mandel 中使用中心和宽度

/* 
   from mndlbrot.cpp  by Wolf Jung (C) 201
   These classes are part of Mandel 5.7, which is free software; you can
   redistribute and / or modify them under the terms of the GNU General
   Public License as published by the Free Software Foundation; either
   version 3, or (at your option) any later version. In short: there is
   no warranty of any kind; you must redistribute the source code as well
*/
void mndlbrot::startPlane(int sg, double &xmid, double &rewidth) const
{  if (sg > 0) 
     { xmid = -0.5; rewidth = 1.6; } // parameter plane
     else { xmid = 0; rewidth = 2.0; } // dynamic plane

宽度和高度

[编辑 | 编辑源代码]

用于描述平面(视图)XaoS 使用

  • 脚本中的 4 个数字
  • 菜单中的 3 个数字

XaoS 使用“半径”来称呼它,但它是这样定义的: (x2-x1 = 宽度) 和 y2-y1 = 高度中较大的那个。

这对于缩放非常有用:固定中心,只改变半径。

Claude Heiland-Allen[5] 使用中心和半径 来表示复二次多项式的参数平面

半径定义为

  • 适合图像实际框架内的圆的半径
  • "中心和轴对齐的视图矩形顶部之间的虚坐标差”。
  • "px_radius 是图像宽度的一半(以实坐标表示)" [6]
view="-0.75 0 1.5" # standard view of parameter plane : center_re, center_im, radius

  // modified code using center and radius to scan the plane 
  int height = 720;
  int width = 1280;
  double dWidth;
  double dRadius = 1.5;
  double complex center= -0.75*I;
  double complex c;
  int i,j;

  double width2; // = width/2.0
  double height2; // = height/2.0
  
  width2 = width /2.0;
  height2 = height/2.0;

complex double coordinate(int i, int j, int width, int height, complex double center, double radius) {
  double x = (i - width /2.0) / (height/2.0);
  double y = (j - height/2.0) / (height/2.0);
  complex double c = center + radius * (x - I * y);
  return c;
}

for ( j = 0; j < height; ++j) {
    for ( i = 0; i < width; ++i) {
      c = coordinate(i, j, width, height, center, dRadius);
      // do smth 
       }
     }

另一个版本

int main()
{
  int aa = 4;
  int w = 800 * aa;
  int h = 800 * aa;
  
  #pragma omp parallel for schedule(static, 1)
  for (int j = 0; j < h; ++j)
  {
    double y = (h/2 - (j + 0.5)) / (h/2) * r;
    for (int i = 0; i < w; ++i)
    {
      double x = (i + 0.5 - w/2) / (h/2) * r;
      double _Complex c = x + I * y;
      // proceed
    }
  }
  
  return 0;
}



同样在 GLSL ( 为 Shadertoy) 中

 
vec2 GiveCoordinate(vec2 center, float radius, vec2 fragCoord, vec3 iResolution)
{
 
  // from pixel to world coordinate   
  // now point (0,0) is left bottom
  // point (iResolution.x, iResolution.y) is right top   
  float x = (fragCoord.x -  iResolution.x/2.0)/ (iResolution.y/2.0);
  float y = (fragCoord.y -  iResolution.y/2.0)/ (iResolution.y/2.0);
  vec2 c = vec2(center.x + radius*x, center.y + radius*y) ;  
  return c ; 
}


根据半径、中心和纵横比设置平面角

 
int SetPlane(complex double center, double radius, double a_ratio){

	ZxMin = creal(center) - radius*a_ratio;	
	ZxMax = creal(center) + radius*a_ratio;	//0.75;
	ZyMin = cimag(center) - radius;	// inv
	ZyMax = cimag(center) + radius;	//0.7;
    double PixelWidth = (ZxMax-ZxMin)/iWidth;
    double PixelHeight = (ZyMax-ZyMin)/iHeight; // pixel_size = PixelWidth = PixelHeight
	return 0;

}

在标准的数学约定和一些 CS 图形编程系统之间存在主要的不兼容性

  • 数学课中教授的标准数学约定 = 标准坐标系 (y 轴向上)
  • 一些 CS 图形编程系统 (但并非所有系统) = y 轴向下



通过标记笛卡尔平面的一象限来检查**平面的方向**

if (x>0 && y>0) Color=MaxColor-Color;

它应该位于右上角。

OpenGL is right handed in object space and world space. But in window space (aka screen space) we are suddenly left handed.[7]

另见

纵横比

[编辑 | 编辑源代码]
  • 图片
  • 显示

图片的纵横比是其宽度与其高度的比率,用冒号分隔的两个数字表示,例如 16:9,十六比九。对于 x:y 纵横比,图片的宽度为 x 个单位,高度为 y 个单位。常见的纵横比包括电影中的 1.85:1 和 2.39:1,电视摄影中的 4:3 和 16:9,以及静止摄影中的 3:2。


显示纵横比

[编辑 | 编辑源代码]

纵横比,更确切地说,**显示纵横比 (DAR)**[8] - 图片显示时的纵横比。对于电视

  • 对于电视,DAR 传统上是 4:3 (即全屏)
  • 现在是 16:9 (即宽屏),现在是高清电视的标准。

参考文献

[编辑 | 编辑源代码]
  1. 维基百科上的欧几里得空间
  2. 非欧几里得几何,作者:Malin Christersson (2018)
  3. 维基百科上的视窗
  4. Xaos - 视图
  5. Claude Heiland-Allen 的博客
  6. 指数映射,作者:Robert P. Munafo,2010 年 12 月 5 日。来自曼德勃罗集词汇表和百科全书,作者:Robert Munafo,版权所有 © 1987-2020。 
  7. stackoverflow 问题:is-opengl-coordinate-system-left-handed-or-right-handed
  8. 维基百科:纵横比 (图像)
  9. michael hogg:fractalnet
  10. Claude Heiland-Allen 对缩放动画的优化
华夏公益教科书