liba 0.1.15
An algorithm library based on C/C++
Loading...
Searching...
No Matches
line2.h
Go to the documentation of this file.
1
5
6#ifndef LIBA_LINE2_H
7#define LIBA_LINE2_H
8
9#include "a.h"
10#include "point2.h"
11
17
19#define a_line2_c(x) a_cast_s(a_line2, x)
20#define a_line2_(_, x) a_cast_s(a_line2 _, x)
21
22typedef struct a_line2 a_line2;
23
24#if defined(__cplusplus)
25namespace a
26{
27typedef struct a_line2 line2;
28} /* namespace a */
29extern "C" {
30#endif /* __cplusplus */
31#if !defined A_HAVE_INLINE || defined(LIBA_LINE2_C)
33#undef A_INTERN
34#define A_INTERN A_PUBLIC extern
36#endif /* A_HAVE_INLINE */
37
38A_INTERN a_real a_line2_lim(a_line2 const *ctx);
39A_INTERN a_point2 const *a_line2_org(a_line2 const *ctx);
40A_INTERN a_vector2 const *a_line2_dir(a_line2 const *ctx);
41A_INTERN void a_line2_tgt(a_line2 const *ctx, a_point2 *res);
42A_INTERN void a_line2_set_org(a_line2 *ctx, a_real x, a_real y);
43A_INTERN void a_line2_set_lim(a_line2 *ctx, a_real max);
44
45A_EXTERN int a_line2_set_dir(a_line2 *ctx, a_real x, a_real y);
46A_EXTERN int a_line2_set_tgt(a_line2 *ctx, a_real x, a_real y);
47A_EXTERN int a_line2_setv(a_line2 *ctx, a_point2 const *p, a_vector2 const *v);
48A_EXTERN int a_line2_set(a_line2 *ctx, a_point2 const *p, a_point2 const *q);
49A_EXTERN void a_line2_eval(a_line2 const *ctx, a_real w, a_point2 *res);
50A_EXTERN a_real a_line2_parm(a_line2 const *ctx, a_point2 const *rhs);
51A_EXTERN a_real a_line2_proj(a_line2 const *ctx, a_point2 const *rhs, a_point2 *res);
52A_EXTERN a_real a_line2_limparm(a_line2 const *ctx, a_real min, a_real max, a_point2 const *rhs);
53A_EXTERN a_real a_line2_limproj(a_line2 const *ctx, a_real min, a_real max, a_point2 const *rhs, a_point2 *res);
54
55A_EXTERN a_real a_line2_sdist(a_line2 const *ctx, a_point2 const *rhs);
56A_EXTERN a_real a_line2_dist(a_line2 const *ctx, a_point2 const *rhs);
57
58A_EXTERN a_real a_line2_limdist(a_line2 const *ctx, a_real min, a_real max, a_point2 const *rhs, a_real *w, a_point2 *p);
59A_EXTERN a_real a_line2_limdist2(a_line2 const *ctx, a_real min, a_real max, a_point2 const *rhs, a_real *w, a_point2 *p);
60
61A_EXTERN a_real a_line2_segdist(a_line2 const *ctx, a_line2 const *rhs,
62 a_real min1, a_real max1, a_real min2, a_real max2,
63 a_real *w1, a_real *w2, a_point2 *p1, a_point2 *p2);
64A_EXTERN a_real a_line2_segdist2(a_line2 const *ctx, a_line2 const *rhs,
65 a_real min1, a_real max1, a_real min2, a_real max2,
66 a_real *w1, a_real *w2, a_point2 *p1, a_point2 *p2);
67
68A_EXTERN int a_line2_int0(a_line2 const *ctx, a_point2 const *rhs, a_real min, a_real max, a_real *w);
69A_EXTERN int a_line2_int1(a_line2 const *ctx, a_line2 const *rhs,
70 a_real min1, a_real max1, a_real min2, a_real max2,
71 a_real *w1, a_real *w2);
72
73A_EXTERN void a_line2_rot(a_line2 const *ctx, a_point2 const *rhs, a_real angle, a_line2 *res);
74
75#if !defined A_HAVE_INLINE || defined(LIBA_LINE2_C)
77#undef A_INTERN
78#define A_INTERN static A_INLINE
80#endif /* A_HAVE_INLINE */
81#if defined(__cplusplus)
82} /* extern "C" */
83#endif /* __cplusplus */
84
88struct a_line2
89{
90 a_point2 orig;
91 a_vector2 dir_;
92 a_real max;
93#if defined(__cplusplus)
94 A_INLINE a_real lim() const { return max; }
95 A_INLINE void set_lim(a_real max_) { max = max_; }
96 A_INLINE a_point2 const &org() const { return orig; }
97 A_INLINE void set_org(a_real x, a_real y)
98 {
99 a_line2_set_org(this, x, y);
100 }
101 A_INLINE a_vector2 const &dir() const { return dir_; }
102 A_INLINE int set_dir(a_real x, a_real y)
103 {
104 return a_line2_set_dir(this, x, y);
105 }
106 A_INLINE void tgt(a_point2 &res) const { a_line2_tgt(this, &res); }
107 A_INLINE int set_tgt(a_real x, a_real y)
108 {
109 return a_line2_set_tgt(this, x, y);
110 }
111 A_INLINE int set(a_point2 const &p, a_vector2 const &v)
112 {
113 return a_line2_setv(this, &p, &v);
114 }
115 A_INLINE int set(a_point2 const &p, a_point2 const &q)
116 {
117 return a_line2_set(this, &p, &q);
118 }
119 A_INLINE void eval(a_real w, a_point2 &res) const
120 {
121 a_line2_eval(this, w, &res);
122 }
123 A_INLINE a_real parm(a_point2 const &rhs) const
124 {
125 return a_line2_parm(this, &rhs);
126 }
127 A_INLINE a_real proj(a_point2 const &rhs, a_point2 &res) const
128 {
129 return a_line2_proj(this, &rhs, &res);
130 }
131 A_INLINE a_real limparm(a_real min, a_real max_, a_point2 const &rhs) const
132 {
133 return a_line2_limparm(this, min, max_, &rhs);
134 }
135 A_INLINE a_real limproj(a_real min, a_real max_, a_point2 const &rhs, a_point2 &res) const
136 {
137 return a_line2_limproj(this, min, max_, &rhs, &res);
138 }
139 A_INLINE a_real sdist(a_point2 const &rhs) const
140 {
141 return a_line2_sdist(this, &rhs);
142 }
143 A_INLINE a_real dist(a_point2 const &rhs) const
144 {
145 return a_line2_dist(this, &rhs);
146 }
147 A_INLINE a_real limdist(a_real min, a_real max_, a_point2 const &rhs, a_real &w, a_point2 &p)
148 {
149 return a_line2_limdist(this, min, max_, &rhs, &w, &p);
150 }
151 A_INLINE a_real limdist2(a_real min, a_real max_, a_point2 const &rhs, a_real &w, a_point2 &p)
152 {
153 return a_line2_limdist2(this, min, max_, &rhs, &w, &p);
154 }
155 A_INLINE a_real segdist(a_line2 const &rhs, a_real min1, a_real max1, a_real min2, a_real max2,
156 a_real &w1, a_real &w2, a_point2 &p1, a_point2 &p2) const
157 {
158 return a_line2_segdist(this, &rhs, min1, max1, min2, max2, &w1, &w2, &p1, &p2);
159 }
160 A_INLINE a_real segdist2(a_line2 const &rhs, a_real min1, a_real max1, a_real min2, a_real max2,
161 a_real &w1, a_real &w2, a_point2 &p1, a_point2 &p2) const
162 {
163 return a_line2_segdist2(this, &rhs, min1, max1, min2, max2, &w1, &w2, &p1, &p2);
164 }
165 A_INLINE int int0(a_point2 const &rhs, a_real min, a_real max_, a_real &w) const
166 {
167 return a_line2_int0(this, &rhs, min, max_, &w);
168 }
169 A_INLINE int int1(a_line2 const &rhs, a_real min1, a_real max1, a_real min2, a_real max2,
170 a_real &w1, a_real &w2) const
171 {
172 return a_line2_int1(this, &rhs, min1, max1, min2, max2, &w1, &w2);
173 }
174 A_INLINE void rot(a_point2 const &rhs, a_real angle, a_line2 &res) const
175 {
176 a_line2_rot(this, &rhs, angle, &res);
177 }
178#endif /* __cplusplus */
179};
180
181#if defined(LIBA_LINE2_C)
183#undef A_INTERN
184#define A_INTERN A_INLINE
186#endif /* LIBA_LINE2_C */
187#if defined(A_HAVE_INLINE) || defined(LIBA_LINE2_C)
188
189A_INTERN a_real a_line2_lim(a_line2 const *ctx)
190{
191 return ctx->max;
192}
193A_INTERN a_point2 const *a_line2_org(a_line2 const *ctx)
194{
195 return &ctx->orig;
196}
197A_INTERN a_vector2 const *a_line2_dir(a_line2 const *ctx)
198{
199 return &ctx->dir_;
200}
201A_INTERN void a_line2_tgt(a_line2 const *ctx, a_point2 *res)
202{
203 a_line2_eval(ctx, ctx->max, res);
204}
205A_INTERN void a_line2_set_org(a_line2 *ctx, a_real x, a_real y)
206{
207 ctx->orig.x = x;
208 ctx->orig.y = y;
209}
210A_INTERN void a_line2_set_lim(a_line2 *ctx, a_real max)
211{
212 ctx->max = max;
213}
214
215#endif /* A_HAVE_INLINE */
216#if defined(LIBA_LINE2_C)
218#undef A_INTERN
219#define A_INTERN static A_INLINE
221#endif /* LIBA_LINE2_C */
222
224
225#endif /* a/line2.h */
algorithm library
double a_real
compiler built-in floating-point number type
Definition a.h:1012
two-dimensional point
instance structure for two-dimensional line
Definition line2.h:89
instance structure for two-dimensional point
Definition point2.h:185
instance structure for two-dimensional vector
Definition vector2.h:315