日积月累Shader - 09 分形图 / Patterns图案

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了日积月累Shader - 09 分形图 / Patterns图案相关的知识,希望对你有一定的参考价值。

参考技术A 教程例子都可以到下面网址进行运行,不需要另外安装软件环境:
官方提供在线编写shader工具: https://thebookofshaders.com/edit.php
glslsandbox网站: http://glslsandbox.com/
shadertoy网站: https://www.shadertoy.com/

我们将这个坐标系缩放就能产生最原始的分形效果

https://thebookofshaders.com/edit.php#09/marching_dots.frag

考虑到 Truchet Tiles 的例子,即一个单一设计元素可以以四种不同的方式呈现:

》制作程序图案是种寻找最小可重复元素的古老练习(灵修)。我们作为长时间使用网格和图案来装饰织物、地面和物品的镶边物种:从古希腊的弯曲图案,到中国的窗栅设计,重复和变化的愉悦吸引我们的想象。花些时间浏览 decorative patterns 并看看在漫长的历史里,艺术家和设计师是如何寻找在秩序的预测性和(由)混沌和衍变(产生)的惊奇之间的边界的。从阿拉伯几何图案,到斑斓的非洲编制艺术,这里有一整个图案的宇宙要学习。

ACwing98 分形之城 分形图

网址:https://www.acwing.com/problem/content/100/

题意:

说着太复杂了,直接看原网页吧$QAQ$。

题解:

首先我们先推一下公式,就是这个点,在高一级图中的另外三个子图的对应位置应该怎么表示出来。首先在$n-1$级图中$2^{2n-2}$个房子,我们将其编号成$0$到$2^{2n-2}-1$,然后$n$级图中的$m$号房子$n-1$级图的房子整除就知道了房子在哪个$n-1$级图中。取模则知道了对应于这个$n-1$级图的哪个房子,然后继续递归直到一级图上,回溯时加上这个图上的点对应于$n-1$级图的偏移量,最后计算出欧氏距离即可。

偏移量:设在$n-1$级图的坐标是$(x,y)$,$n-1$级图长度为$len$,则:

如果在$n$级图中的$1$号图,则实际坐标为$(y,x)$。

如果在$n$级图中的$1$号图,则实际坐标为$(x,y+len)$。

如果在$n$级图中的$1$号图,则实际坐标为$(x+len,y+len)$。

如果在$n$级图中的$1$号图,则实际坐标为$(len×2-y-1,len-x-1)$。

AC代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
pair<ll, ll> calc(int n, ll m)
{
	if (n == 0)
		return make_pair(0, 0);
	ll len = 1ll << (n - 1), cnt = 1ll << ((n << 1) - 2);
	auto p = calc(n - 1, m % cnt);
	ll x = p.first, y = p.second;
	ll z = m / cnt;
	if (z == 0)
		return make_pair(y, x);
	else if (z == 1)
		return make_pair(x, y + len);
	else if (z == 2)
		return make_pair(x + len, y + len);
	else if (z == 3)
		return make_pair(-y + (len << 1) - 1, -x + len - 1);
}
double dist(pair<ll, ll>& a, pair<ll, ll>& b)
{
	return sqrt((a.first - b.first) * (a.first - b.first) + (a.second - b.second) * (a.second - b.second));
}
int main()
{
	int T;
	scanf("%d", &T);
	while (T--)
	{
		int n;
		ll s, d;
		scanf("%d%lld%lld", &n, &s, &d);
		auto p1 = calc(n, s - 1), p2 = calc(n, d - 1);
		double dis = dist(p1, p2);
		printf("%0.0f
", dis * 10);
	}
	return 0;
}

 

以上是关于日积月累Shader - 09 分形图 / Patterns图案的主要内容,如果未能解决你的问题,请参考以下文章

ACwing98 分形之城 分形图

有没有关于递归算法方面的书?

用Perl语言编写冰雹猜想程序

POJ3889 Fractal Streets

改进我的 Mandelbrot 集代码

Java岗大厂面试百日冲刺Day47— 并发编程4(日积月累,每日三题)