# 等角螺线
等角螺线。
等角螺线,一个很有意思的几何图形。
等角螺线的臂的距离以几何级数递增。 等角螺线是自我相似的;这即是说,等角螺线经放大后可与原图完全相同。 等角螺线的渐屈线和垂足曲线都是等角螺线。 从原点到等角螺线的任意点上的长度有限,但由那点出发沿等角螺线走到原点却需绕原点转无限次。
# 关键点
- 借助了三角函数,而 CSS 本身是没有三角函数的,所以需要使用 SCSS 实现三角函数方法(Sin、Cos)
- SCSS 实现三角函数又借助了泰勒公式,具体可以看我的这篇文章:在 CSS 中使用三角函数绘制曲线图形及展示动画
Pug模板(HTML模板引擎):
- for(var i=0; i<32; i++)
.box
SCSS:
// scss 实现 sin、cos、tan
$pi: 3.14159265359;
$_precision: 10;
@function pow($base, $exp) {
$value: $base;
@if $exp > 1 {
@for $i from 2 through $exp {
$value: $value * $base;
}
}
@if $exp < 1 {
@for $i from 0 through -$exp {
$value: $value / $base;
}
}
@return $value;
}
@function fact($num) {
$fact: 1;
@if $num > 0 {
@for $i from 1 through $num {
$fact: $fact * $i;
}
}
@return $fact;
}
@function _to_unitless_rad($angle) {
@if unit($angle) == "deg" {
$angle: $angle / 180deg * $pi;
}
@if unit($angle) == "rad" {
$angle: $angle / 1rad;
}
@return $angle;
}
@function sin($angle) {
$a: _to_unitless_rad($angle);
$sin: $a;
@for $n from 1 through $_precision {
$sin: $sin + (pow(-1, $n) / fact(2 * $n + 1)) * pow($a, (2 * $n + 1));
}
@return $sin;
}
@function cos($angle) {
$a: _to_unitless_rad($angle);
$cos: 1;
@for $n from 1 through $_precision {
$cos: $cos + (pow(-1, $n) / fact(2 * $n)) * pow($a, 2 * $n);
}
@return $cos;
}
@function tan($angle) {
@return sin($angle) / cos($angle);
}
$squares: 32;
$angle: $pi / ($squares - 1);
$ratio: 1 / (sin($angle) + cos($angle));
$size: 100;
div {
position: absolute;
left: 50%;
top: 50%;
border: 2px black solid;
@for $i from 0 through $squares {
&:nth-child(#{$i}) {
$s: pow($ratio, $i) * $size;
width: #{$s}vmin;
height: #{$s}vmin;
transform: translate(-50%, -50%) rotate(#{$angle}rad);
}
$angle: $i * $pi / ($squares - 1);
}
}
效果如下:
当然,可以加上色彩:
或者加上动画:
阅读全文