Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenlib/intern/math_geom.c
| Show First 20 Lines • Show All 288 Lines • ▼ Show 20 Lines | float dist_squared_to_line_segment_v2(const float p[2], const float l1[2], const float l2[2]) | ||||
| return len_squared_v2v2(closest, p); | return len_squared_v2v2(closest, p); | ||||
| } | } | ||||
| float dist_to_line_segment_v2(const float p[2], const float l1[2], const float l2[2]) | float dist_to_line_segment_v2(const float p[2], const float l1[2], const float l2[2]) | ||||
| { | { | ||||
| return sqrtf(dist_squared_to_line_segment_v2(p, l1, l2)); | return sqrtf(dist_squared_to_line_segment_v2(p, l1, l2)); | ||||
| } | } | ||||
| void closest_to_line_segment_v2(float r_close[2], | float closest_to_line_segment_v2(float r_close[2], | ||||
| const float p[2], | const float p[2], | ||||
| const float l1[2], | const float l1[2], | ||||
| const float l2[2]) | const float l2[2]) | ||||
| { | { | ||||
| float lambda, cp[2]; | float lambda, cp[2]; | ||||
| lambda = closest_to_line_v2(cp, p, l1, l2); | lambda = closest_to_line_v2(cp, p, l1, l2); | ||||
| /* flip checks for !finite case (when segment is a point) */ | /* flip checks for !finite case (when segment is a point) */ | ||||
| if (!(lambda > 0.0f)) { | if (lambda <= 0.0f) { | ||||
| copy_v2_v2(r_close, l1); | copy_v2_v2(r_close, l1); | ||||
| return 0.0f; | |||||
| } | } | ||||
| else if (!(lambda < 1.0f)) { | if (lambda >= 1.0f) { | ||||
| copy_v2_v2(r_close, l2); | copy_v2_v2(r_close, l2); | ||||
| return 1.0f; | |||||
| } | } | ||||
| else { | |||||
| copy_v2_v2(r_close, cp); | copy_v2_v2(r_close, cp); | ||||
| } | return lambda; | ||||
| } | } | ||||
| void closest_to_line_segment_v3(float r_close[3], | float closest_to_line_segment_v3(float r_close[3], | ||||
| const float p[3], | const float p[3], | ||||
| const float l1[3], | const float l1[3], | ||||
| const float l2[3]) | const float l2[3]) | ||||
| { | { | ||||
| float lambda, cp[3]; | float lambda, cp[3]; | ||||
| lambda = closest_to_line_v3(cp, p, l1, l2); | lambda = closest_to_line_v3(cp, p, l1, l2); | ||||
| /* flip checks for !finite case (when segment is a point) */ | /* flip checks for !finite case (when segment is a point) */ | ||||
| if (!(lambda > 0.0f)) { | if (lambda <= 0.0f) { | ||||
| copy_v3_v3(r_close, l1); | copy_v3_v3(r_close, l1); | ||||
| return 0.0f; | |||||
| } | } | ||||
| else if (!(lambda < 1.0f)) { | if (lambda >= 1.0f) { | ||||
| copy_v3_v3(r_close, l2); | copy_v3_v3(r_close, l2); | ||||
| return 1.0f; | |||||
| } | } | ||||
| else { | |||||
| copy_v3_v3(r_close, cp); | copy_v3_v3(r_close, cp); | ||||
| } | return lambda; | ||||
| } | } | ||||
| void closest_to_plane_v3(float r_close[3], const float plane[4], const float pt[3]) | void closest_to_plane_v3(float r_close[3], const float plane[4], const float pt[3]) | ||||
| { | { | ||||
| const float len_sq = len_squared_v3(plane); | const float len_sq = len_squared_v3(plane); | ||||
| const float side = plane_point_side_v3(plane, pt); | const float side = plane_point_side_v3(plane, pt); | ||||
| madd_v3_v3v3fl(r_close, pt, plane, -side / len_sq); | madd_v3_v3v3fl(r_close, pt, plane, -side / len_sq); | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 5,559 Lines • Show Last 20 Lines | |||||