1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
|
// ----------------------------------------------------------------------------
// Copyright (c) 2014, Nicolas P. Rougier. All Rights Reserved.
// Distributed under the (new) BSD License.
// ----------------------------------------------------------------------------
#include "math/signed-line-distance.glsl"
#include "math/point-to-line-distance.glsl"
#include "math/signed-segment-distance.glsl"
#include "math/circle-through-2-points.glsl"
#include "math/point-to-line-projection.glsl"
/* ---------------------------------------------------------
Computes the signed distance to a triangle arrow
Parameters:
-----------
texcoord : Point to compute distance to
body : Total length of the arrow (pixels, body+head)
head : Length of the head (pixels)
height : Height of the head (pixel)
linewidth: Stroke line width (in pixels)
antialias: Stroke antialiased area (in pixels)
Return:
-------
Signed distance to the arrow
--------------------------------------------------------- */
float arrow_triangle(vec2 texcoord,
float body, float head, float height,
float linewidth, float antialias)
{
float w = linewidth/2.0 + antialias;
vec2 start = -vec2(body/2.0, 0.0);
vec2 end = +vec2(body/2.0, 0.0);
// Head : 3 lines
float d1 = line_distance(texcoord, end, end - head*vec2(+1.0,-height));
float d2 = line_distance(texcoord, end - head*vec2(+1.0,+height), end);
float d3 = texcoord.x - end.x + head;
// Body : 1 segment
float d4 = segment_distance(texcoord, start, end - vec2(linewidth,0.0));
float d = min(max(max(d1, d2), -d3), d4);
return d;
}
/* ---------------------------------------------------------
Computes the signed distance to an angle arrow
Parameters:
-----------
texcoord : Point to compute distance to
body : Total length of the arrow (pixels, body+head)
head : Length of the head (pixels)
height : Height of the head (pixel)
linewidth: Stroke line width (in pixels)
antialias: Stroke antialiased area (in pixels)
Return:
-------
Signed distance to the arrow
--------------------------------------------------------- */
float arrow_angle(vec2 texcoord,
float body, float head, float height,
float linewidth, float antialias)
{
float d;
float w = linewidth/2.0 + antialias;
vec2 start = -vec2(body/2.0, 0.0);
vec2 end = +vec2(body/2.0, 0.0);
// Arrow tip (beyond segment end)
if( texcoord.x > body/2.0) {
// Head : 2 segments
float d1 = line_distance(texcoord, end, end - head*vec2(+1.0,-height));
float d2 = line_distance(texcoord, end - head*vec2(+1.0,+height), end);
// Body : 1 segment
float d3 = end.x - texcoord.x;
d = max(max(d1,d2), d3);
} else {
// Head : 2 segments
float d1 = segment_distance(texcoord, end - head*vec2(+1.0,-height), end);
float d2 = segment_distance(texcoord, end - head*vec2(+1.0,+height), end);
// Body : 1 segment
float d3 = segment_distance(texcoord, start, end - vec2(linewidth,0.0));
d = min(min(d1,d2), d3);
}
return d;
}
|