html - 在 svg 中绘制路径,垂直线之间有 90° 弧
问题描述
我想在空间中的 2 点之间绘制两条垂直线段。
而不是两点之间90°的视觉效果,我想画一个圆弧(四分之一圆)来视觉上平滑角度。
如果使用弧形贝塞尔曲线,我很难理解路径是如何形成的——你能展示一个解决方案并解释什么参数的作用吗?
我还想知道绘制路径在计算上的表现如何——它们只使用 MHV 参数执行路径,尊重绘制弧线或贝塞尔曲线?
我阅读了指南,但还没有达到我想要的结果。
例子:
到目前为止,我有:
// draw two perpendicular segments between points (0,0) and (100, 100)
<svg viewBox="0 0 200 200">
<path
d="
M 0,0
H 100
V 100
"
/>
</svg>
这在视觉上看起来像是由点 A(0,0) 和 C(100,100) 之间的两条垂直线段组成的虚线,它们在 B(100,0) 处相交。
现在,我想在 A 点和 C 点之间绘制两条垂直线段,并放置一个四分之一圆弧而不是 B 点,以使这两条线段形成连续线的方式定向- 而不是“折线”(不是英语母语,我希望你明白我所说的“断线”是什么意思)。
这是我想出的最巧妙的解决方案,但仍然无法正常工作:
// attempt to draw a " curve " between 2 perpendicular segments > failed
<svg viewBox="0 0 200 200">
<path
d="
M 0,80
H 80
Q 100,100 100, 100
V 200
"
/>
</svg>
解决方案
不同的人学习不同的方式,所以把它作为一些一般提示如何找出路径命令是如何工作的:
在您的示例中,我认为主要问题是使用H
andV
命令。它们是L
命令的简写,其中 x 或 y 坐标被忽略并从最后一个控制点复制。这两条路径是等价的:
M 0,80 L 90,80
M 0,80 H 90
就像这些
M 100,90 L 100,200
M 100,90 V 200
现在,用一条直线段连接这两者:
M 0,80 L 90,80 L 100,90 L 100,200
(90,80)
现在,您必须在曲线之间交换直线(100,90)
。它可能是二次贝塞尔曲线(第二行是简写形式):
M 0,80 L 90,80 Q 100,80 100,90 L 100,200
M 0,80 H 90 Q 100,80 100,90 V 200
曲线开始于(90,80)
,中间控制点位于(100,80)
,结束于(100,90)
。
或者你可以使用一个真正的弧:
M 0,80 L 90,80 A 10 10 0 0 1 100,90 L 100,200
M 0,80 H 90 A 10 10 0 0 1 100,90 V 200
起点和终点保持不变。该命令的其余部分有点复杂:
- 前两个数字是弧的水平和垂直半径
- 第三个数字将旋转这两个轴,0 表示不旋转
- 第四位的 0 表示弧线绕椭圆的角度小于 180 度(1 表示 > 180)
- 第五位的 1 表示弧顺时针方向运行(1 表示逆时针方向)
复杂?该规范有一个很好的解释它。
path {
fill:none;
stroke:black;
}
<svg viewBox="0 0 300 200">
<path d="M 0,80 L 90,80 Q 100,80 100,90 L 100,200" />
<path d="M 100,80 L 190,80 A 10 10 0 0 1 200,90 L 200,200" />
</svg>
推荐阅读
- javascript - 是否可以从另一个 AJV 定义中引用枚举中的属性名称?
- linux - 如何让 sed 在第一场比赛而不是之后退出?
- python - 如何在 tensorflow 2.0 中支持自定义量化?
- php - How to integrate a vuejs template library into a Laravel project?
- ios - Firebase Pods 不断发布新版本/更改源
- javascript - 条纹输入字段不会显示
- javascript - 如何在对象数组的嵌套数组中获取数组对象javascript
- three.js - Three.js: Not able to combine background pass with outline pass
- svelte - if there is a way to access to the component's node in the component?
- firebase - Firestore 批量写入回滚?