liba 0.1.15
An algorithm library based on C/C++
Loading...
Searching...
No Matches
line3.h
Go to the documentation of this file.
1
5
6#ifndef LIBA_LINE3_H
7#define LIBA_LINE3_H
8
9#include "a.h"
10#include "point3.h"
11
17
19#define a_line3_c(x) a_cast_s(a_line3, x)
20#define a_line3_(_, x) a_cast_s(a_line3 _, x)
21
22typedef struct a_line3 a_line3;
23
24#if defined(__cplusplus)
25namespace a
26{
27typedef struct a_line3 line3;
28} /* namespace a */
29extern "C" {
30#endif /* __cplusplus */
31#if !defined A_HAVE_INLINE || defined(LIBA_LINE3_C)
32#undef A_INTERN
33#define A_INTERN A_PUBLIC extern
34#endif /* A_HAVE_INLINE */
35
36A_INTERN a_real a_line3_lim(a_line3 const *ctx);
37A_INTERN a_point3 const *a_line3_org(a_line3 const *ctx);
38A_INTERN a_vector3 const *a_line3_dir(a_line3 const *ctx);
39A_INTERN void a_line3_tgt(a_line3 const *ctx, a_point3 *res);
40A_INTERN void a_line3_set_org(a_line3 *ctx, a_real x, a_real y, a_real z);
41A_INTERN void a_line3_set_lim(a_line3 *ctx, a_real max);
42
43A_EXTERN int a_line3_set_dir(a_line3 *ctx, a_real x, a_real y, a_real z);
44A_EXTERN int a_line3_set_tgt(a_line3 *ctx, a_real x, a_real y, a_real z);
45A_EXTERN int a_line3_setv(a_line3 *ctx, a_point3 const *p, a_vector3 const *v);
46A_EXTERN int a_line3_set(a_line3 *ctx, a_point3 const *p, a_point3 const *q);
47A_EXTERN void a_line3_eval(a_line3 const *ctx, a_real w, a_point3 *res);
48A_EXTERN a_real a_line3_parm(a_line3 const *ctx, a_point3 const *rhs);
49A_EXTERN a_real a_line3_proj(a_line3 const *ctx, a_point3 const *rhs, a_point3 *res);
50A_EXTERN a_real a_line3_limparm(a_line3 const *ctx, a_real min, a_real max, a_point3 const *rhs);
51A_EXTERN a_real a_line3_limproj(a_line3 const *ctx, a_real min, a_real max, a_point3 const *rhs, a_point3 *res);
52
53A_EXTERN void a_line3_sdist(a_line3 const *ctx, a_point3 const *rhs, a_vector3 *res);
54A_EXTERN a_real a_line3_dist(a_line3 const *ctx, a_point3 const *rhs);
55A_EXTERN a_real a_line3_dist1(a_line3 const *ctx, a_point3 const *rhs);
56A_EXTERN a_real a_line3_dist2(a_line3 const *ctx, a_point3 const *rhs);
57
58A_EXTERN a_real a_line3_limdist(a_line3 const *ctx, a_real min, a_real max, a_point3 const *rhs, a_real *w, a_point3 *p);
59A_EXTERN a_real a_line3_limdist1(a_line3 const *ctx, a_real min, a_real max, a_point3 const *rhs, a_real *w, a_point3 *p);
60A_EXTERN a_real a_line3_limdist2(a_line3 const *ctx, a_real min, a_real max, a_point3 const *rhs, a_real *w, a_point3 *p);
61
62A_EXTERN a_real a_line3_segdist(a_line3 const *ctx, a_line3 const *rhs,
63 a_real min1, a_real max1, a_real min2, a_real max2,
64 a_real *w1, a_real *w2, a_point3 *p1, a_point3 *p2);
65A_EXTERN a_real a_line3_segdist2(a_line3 const *ctx, a_line3 const *rhs,
66 a_real min1, a_real max1, a_real min2, a_real max2,
67 a_real *w1, a_real *w2, a_point3 *p1, a_point3 *p2);
68
69A_EXTERN int a_line3_int0(a_line3 const *ctx, a_point3 const *rhs, a_real min, a_real max, a_real *w);
70A_EXTERN int a_line3_int1(a_line3 const *ctx, a_line3 const *rhs,
71 a_real min1, a_real max1, a_real min2, a_real max2,
72 a_real *w1, a_real *w2);
73
74A_EXTERN void a_line3_rot(a_line3 const *ctx, a_line3 const *rhs, a_real angle, a_line3 *res);
75
76#if !defined A_HAVE_INLINE || defined(LIBA_LINE3_C)
77#undef A_INTERN
78#define A_INTERN static A_INLINE
79#endif /* A_HAVE_INLINE */
80#if defined(__cplusplus)
81} /* extern "C" */
82#endif /* __cplusplus */
83
87struct a_line3
88{
89 a_point3 orig;
90 a_vector3 dir_;
91 a_real max;
92#if defined(__cplusplus)
93 A_INLINE a_real lim() const { return max; }
94 A_INLINE void set_lim(a_real max_) { max = max_; }
95 A_INLINE a_point3 const &org() const { return orig; }
96 A_INLINE void set_org(a_real x, a_real y, a_real z)
97 {
98 a_line3_set_org(this, x, y, z);
99 }
100 A_INLINE a_vector3 const &dir() const { return dir_; }
101 A_INLINE int set_dir(a_real x, a_real y, a_real z)
102 {
103 return a_line3_set_dir(this, x, y, z);
104 }
105 A_INLINE void tgt(a_point3 &res) const { a_line3_tgt(this, &res); }
106 A_INLINE int set_tgt(a_real x, a_real y, a_real z)
107 {
108 return a_line3_set_tgt(this, x, y, z);
109 }
110 A_INLINE int set(a_point3 const &p, a_vector3 const &v)
111 {
112 return a_line3_setv(this, &p, &v);
113 }
114 A_INLINE int set(a_point3 const &p, a_point3 const &q)
115 {
116 return a_line3_set(this, &p, &q);
117 }
118 A_INLINE void eval(a_real w, a_point3 &res) const
119 {
120 a_line3_eval(this, w, &res);
121 }
122 A_INLINE a_real parm(a_point3 const &rhs) const
123 {
124 return a_line3_parm(this, &rhs);
125 }
126 A_INLINE a_real proj(a_point3 const &rhs, a_point3 &res) const
127 {
128 return a_line3_proj(this, &rhs, &res);
129 }
130 A_INLINE a_real limparm(a_real min, a_real max_, a_point3 const &rhs) const
131 {
132 return a_line3_limparm(this, min, max_, &rhs);
133 }
134 A_INLINE a_real limproj(a_real min, a_real max_, a_point3 const &rhs, a_point3 &res) const
135 {
136 return a_line3_limproj(this, min, max_, &rhs, &res);
137 }
138 A_INLINE a_real dist(a_point3 const &rhs) const
139 {
140 return a_line3_dist(this, &rhs);
141 }
142 A_INLINE a_real dist1(a_point3 const &rhs) const
143 {
144 return a_line3_dist1(this, &rhs);
145 }
146 A_INLINE a_real dist2(a_point3 const &rhs) const
147 {
148 return a_line3_dist2(this, &rhs);
149 }
150 A_INLINE a_real limdist(a_real min, a_real max_, a_point3 const &rhs, a_real &w, a_point3 &p)
151 {
152 return a_line3_limdist(this, min, max_, &rhs, &w, &p);
153 }
154 A_INLINE a_real limdist1(a_real min, a_real max_, a_point3 const &rhs, a_real &w, a_point3 &p)
155 {
156 return a_line3_limdist1(this, min, max_, &rhs, &w, &p);
157 }
158 A_INLINE a_real limdist2(a_real min, a_real max_, a_point3 const &rhs, a_real &w, a_point3 &p)
159 {
160 return a_line3_limdist2(this, min, max_, &rhs, &w, &p);
161 }
162 A_INLINE a_real segdist(a_line3 const &rhs, a_real min1, a_real max1, a_real min2, a_real max2,
163 a_real &w1, a_real &w2, a_point3 &p1, a_point3 &p2) const
164 {
165 return a_line3_segdist(this, &rhs, min1, max1, min2, max2, &w1, &w2, &p1, &p2);
166 }
167 A_INLINE a_real segdist2(a_line3 const &rhs, a_real min1, a_real max1, a_real min2, a_real max2,
168 a_real &w1, a_real &w2, a_point3 &p1, a_point3 &p2) const
169 {
170 return a_line3_segdist2(this, &rhs, min1, max1, min2, max2, &w1, &w2, &p1, &p2);
171 }
172 A_INLINE int int0(a_point3 const &rhs, a_real min, a_real max_, a_real &w) const
173 {
174 return a_line3_int0(this, &rhs, min, max_, &w);
175 }
176 A_INLINE int int1(a_line3 const &rhs, a_real min1, a_real max1, a_real min2, a_real max2,
177 a_real &w1, a_real &w2) const
178 {
179 return a_line3_int1(this, &rhs, min1, max1, min2, max2, &w1, &w2);
180 }
181 A_INLINE void rot(a_line3 const &rhs, a_real angle, a_line3 &res) const
182 {
183 a_line3_rot(this, &rhs, angle, &res);
184 }
185#endif /* __cplusplus */
186};
187
188#if defined(LIBA_LINE3_C)
189#undef A_INTERN
190#define A_INTERN A_INLINE
191#endif /* LIBA_LINE3_C */
192#if defined(A_HAVE_INLINE) || defined(LIBA_LINE3_C)
193
194A_INTERN a_real a_line3_lim(a_line3 const *ctx)
195{
196 return ctx->max;
197}
198A_INTERN a_point3 const *a_line3_org(a_line3 const *ctx)
199{
200 return &ctx->orig;
201}
202A_INTERN a_vector3 const *a_line3_dir(a_line3 const *ctx)
203{
204 return &ctx->dir_;
205}
206A_INTERN void a_line3_tgt(a_line3 const *ctx, a_point3 *res)
207{
208 a_line3_eval(ctx, ctx->max, res);
209}
210A_INTERN void a_line3_set_org(a_line3 *ctx, a_real x, a_real y, a_real z)
211{
212 ctx->orig.x = x;
213 ctx->orig.y = y;
214 ctx->orig.z = z;
215}
216A_INTERN void a_line3_set_lim(a_line3 *ctx, a_real max)
217{
218 ctx->max = max;
219}
220
221#endif /* A_HAVE_INLINE */
222#if defined(LIBA_LINE3_C)
223#undef A_INTERN
224#define A_INTERN static A_INLINE
225#endif /* LIBA_LINE3_C */
226
228
229#endif /* a/line3.h */
algorithm library
double a_real
compiler built-in floating-point number type
Definition a.h:1012
three-dimensional point
instance structure for three-dimensional line
Definition line3.h:88
instance structure for three-dimensional point
Definition point3.h:77
instance structure for three-dimensional vector
Definition vector3.h:87