libdmtx 0.7.8.7
libdmtx is a software library that enables programs to read and write Data Matrix barcodes of the modern ECC200 variety.
Loading...
Searching...
No Matches
dmtxvector2.c
Go to the documentation of this file.
1
17#include <assert.h>
18#include <math.h>
19
20#include "dmtx.h"
21#include "dmtxstatic.h"
22
27{
28 v1->x += v2->x;
29 v1->y += v2->y;
30
31 return v1;
32}
33
38{
39 *vOut = *v1;
40
41 return dmtxVector2AddTo(vOut, v2);
42}
43
48{
49 v1->x -= v2->x;
50 v1->y -= v2->y;
51
52 return v1;
53}
54
59{
60 *vOut = *v1;
61
62 return dmtxVector2SubFrom(vOut, v2);
63}
64
69{
70 v->x *= s;
71 v->y *= s;
72
73 return v;
74}
75
79extern DmtxVector2 *dmtxVector2Scale(OUT DmtxVector2 *vOut, const DmtxVector2 *v, double s)
80{
81 *vOut = *v;
82
83 return dmtxVector2ScaleBy(vOut, s);
84}
85
89extern double dmtxVector2Cross(const DmtxVector2 *v1, const DmtxVector2 *v2)
90{
91 return (v1->x * v2->y) - (v1->y * v2->x);
92}
93
98{
99 double mag;
100
101 mag = dmtxVector2Mag(v);
102
103 if (mag <= DmtxAlmostZero) {
104 return -1.0; /* XXX this doesn't look clean */
105 }
106
107 dmtxVector2ScaleBy(v, 1 / mag);
108
109 return mag;
110}
111
115extern double dmtxVector2Dot(const DmtxVector2 *v1, const DmtxVector2 *v2)
116{
117 return (v1->x * v2->x) + (v1->y * v2->y);
118}
119
123extern double dmtxVector2Mag(const DmtxVector2 *v)
124{
125 return sqrt(v->x * v->x + v->y * v->y);
126}
127
131extern double dmtxDistanceFromRay2(const DmtxRay2 *r, const DmtxVector2 *q)
132{
133 DmtxVector2 vSubTmp;
134
135 double mag = dmtxVector2Mag(&(r->v));
136 DmtxAssert(fabs(mag) > DmtxAlmostZero);
137
138 return dmtxVector2Cross(&(r->v), dmtxVector2Sub(&vSubTmp, q, &(r->p))) / mag;
139}
140
145extern double dmtxDistanceAlongRay2(const DmtxRay2 *r, const DmtxVector2 *q)
146{
147 DmtxVector2 vSubTmp;
148
149#ifdef DEBUG
150 /* Assumes that v is a unit vector */
151 if (fabs(1.0 - dmtxVector2Mag(&(r->v))) > DmtxAlmostZero) {
152 ; /* XXX big error goes here */
153 }
154#endif
155
156 return dmtxVector2Dot(dmtxVector2Sub(&vSubTmp, q, &(r->p)), &(r->v));
157}
158
170extern DmtxPassFail dmtxRay2Intersect(OUT DmtxVector2 *point, const DmtxRay2 *p0, const DmtxRay2 *p1)
171{
172 double numer, denom;
173 DmtxVector2 w;
174
175 denom = dmtxVector2Cross(&(p1->v), &(p0->v));
176 if (fabs(denom) <= DmtxAlmostZero) {
177 return DmtxFail;
178 }
179
180 dmtxVector2Sub(&w, &(p1->p), &(p0->p));
181 numer = dmtxVector2Cross(&(p1->v), &w);
182
183 return dmtxPointAlongRay2(point, p0, numer / denom);
184}
185
195extern DmtxPassFail dmtxPointAlongRay2(OUT DmtxVector2 *point, const DmtxRay2 *r, double t)
196{
197 DmtxVector2 vTmp;
198
199 /* Ray should always have unit length of 1 */
200 DmtxAssert(fabs(1.0 - dmtxVector2Mag(&(r->v))) <= DmtxAlmostZero); // XXX: 是必须的吗?为什么不用dmtxVector2Norm
201
202 dmtxVector2Scale(&vTmp, &(r->v), t);
203 dmtxVector2Add(point, &(r->p), &vTmp);
204
205 return DmtxPass;
206}
libdmtx - Data Matrix Encoding/Decoding Library Copyright 2008, 2009 Mike Laughton.
#define DmtxPassFail
Definition dmtx.h:42
#define DmtxPass
Definition dmtx.h:43
#define INOUT
Definition dmtx.h:76
#define DmtxFail
Definition dmtx.h:44
#define OUT
Definition dmtx.h:75
libdmtx - Data Matrix Encoding/Decoding Library Copyright 2008, 2009 Mike Laughton.
#define DmtxAssert(expr)
Definition dmtxstatic.h:96
#define DmtxAlmostZero
Definition dmtxstatic.h:25
double dmtxVector2Cross(const DmtxVector2 *v1, const DmtxVector2 *v2)
二维向量叉积
Definition dmtxvector2.c:89
DmtxVector2 * dmtxVector2Scale(OUT DmtxVector2 *vOut, const DmtxVector2 *v, double s)
向量数乘
Definition dmtxvector2.c:79
DmtxVector2 * dmtxVector2ScaleBy(INOUT DmtxVector2 *v, double s)
向量数乘
Definition dmtxvector2.c:68
DmtxVector2 * dmtxVector2SubFrom(INOUT DmtxVector2 *v1, const DmtxVector2 *v2)
向量相减
Definition dmtxvector2.c:47
DmtxPassFail dmtxPointAlongRay2(OUT DmtxVector2 *point, const DmtxRay2 *r, double t)
计算直线上特定位置的点
double dmtxVector2Mag(const DmtxVector2 *v)
二维向量的模
double dmtxDistanceFromRay2(const DmtxRay2 *r, const DmtxVector2 *q)
计算点到直线的垂直距离
DmtxPassFail dmtxRay2Intersect(OUT DmtxVector2 *point, const DmtxRay2 *p0, const DmtxRay2 *p1)
判断两条直线是否相交,并计算交点。
double dmtxVector2Norm(INOUT DmtxVector2 *v)
归一化
Definition dmtxvector2.c:97
DmtxVector2 * dmtxVector2Add(OUT DmtxVector2 *vOut, const DmtxVector2 *v1, const DmtxVector2 *v2)
向量相加
Definition dmtxvector2.c:37
DmtxVector2 * dmtxVector2AddTo(INOUT DmtxVector2 *v1, const DmtxVector2 *v2)
向量相加
Definition dmtxvector2.c:26
DmtxVector2 * dmtxVector2Sub(OUT DmtxVector2 *vOut, const DmtxVector2 *v1, const DmtxVector2 *v2)
向量相减
Definition dmtxvector2.c:58
double dmtxDistanceAlongRay2(const DmtxRay2 *r, const DmtxVector2 *q)
double dmtxVector2Dot(const DmtxVector2 *v1, const DmtxVector2 *v2)
二维向量点积
向量表示的直线(线段)
Definition dmtx.h:286
DmtxVector2 p
Definition dmtx.h:289
DmtxVector2 v
Definition dmtx.h:290
二维向量
Definition dmtx.h:277