OpenVSP API Documentation 3.52.0
Loading...
Searching...
No Matches
Vec2d.h
1//
2// This file is released under the terms of the NASA Open Source Agreement (NOSA)
3// version 1.3 as detailed in the LICENSE file which accompanies this software.
4//
5
6//******************************************************************************
7//
8// 2D Point Double Class
9//
10// Paul C. Davis & J.R. Gloudemans
11// Date - 6/13/94
12//
13//******************************************************************************
14
15
16#ifndef VSPVEC2D_H
17#define VSPVEC2D_H
18
19#include <iostream>
20#include <vector>
21
22class vec2d;
23
24//==== Forward declare to get around MS Compiler bug ====//
25vec2d operator+( const vec2d& a, const vec2d& b );
26vec2d operator-( const vec2d& a, const vec2d& b );
27vec2d operator*( const vec2d& a, double b );
28vec2d operator*( const vec2d& a, const vec2d& b );
29vec2d operator/( const vec2d& a, double b );
30
31//==== And the free functions. Declared only as friends below, which makes them findable by ADL but
32//==== not by ordinary name lookup, so ScriptMgr could not take their address to register them.
33//==== The documentation stays on the friend declarations, which is where doxygen reads it. ====//
34double dist( const vec2d& a, const vec2d& b );
35double dist_squared( const vec2d& a, const vec2d& b );
36double cross( const vec2d& a, const vec2d& b );
37double dot( const vec2d& a, const vec2d& b );
38double angle( const vec2d& a, const vec2d& b );
39double cos_angle( const vec2d& a, const vec2d& b );
40int seg_seg_intersect( const vec2d& pnt_A, const vec2d& pnt_B, const vec2d& pnt_C, const vec2d& pnt_D, vec2d& int_pnt, double &t1, double &t2 );
41vec2d proj_pnt_on_line_seg( const vec2d& line_A, const vec2d& line_B, const vec2d& pnt );
42double proj_pnt_on_line_u( const vec2d& line_A, const vec2d& line_B, const vec2d& pnt );
43void encode( double x_min, double y_min, double x_max, double y_max, const vec2d& pnt, int code[4] );
44void clip_seg_rect( double x_min, double y_min, double x_max, double y_max, vec2d& pnt1, vec2d& pnt2, int& visible );
45bool PointInPolygon( const vec2d & R, const std::vector< vec2d > & pnts );
46double det( const vec2d & p0, const vec2d & p1, const vec2d & offset );
47double poly_area( const std::vector< vec2d > & pnt_vec );
48vec2d poly_centroid( const std::vector< vec2d > & pnt_vec );
49double orient2d( const vec2d & p0, const vec2d & p1, const vec2d & p );
50void bi_lin_interp( const vec2d &p0, const vec2d &p1, const vec2d &p2, vec2d const &p3, double s, double t, vec2d &p_out );
51int inverse_bi_lin_interp( const vec2d &p0, const vec2d &p1, const vec2d &p2, vec2d const &p3, const vec2d &p, double &s, double &t, double &s2, double &t2 );
52
53
61class vec2d
62{
63private:
64
65public:
66 double v[2];
67
73 vec2d();
74
75 // The copy constructor, copy assignment operator, and destructor are intentionally left implicit.
76 // This keeps vec2d trivially copyable, so vector<vec2d> copies can use the memmove fast path
77 // instead of calling an out-of-line function per element.
78#ifdef SWIG
79 vec2d( const vec2d& a ); // vec2d x = y -- implicit in C++, declared so SWIG wraps it for the bindings.
80#endif
81
110
111 vec2d( double xx, double yy );
112
113 vec2d& operator=( double a ); // x = 35.
114
147
148 double& operator [] ( int i )
149 {
150 return v[i];
151 }
152 const double& operator [] ( int i ) const
153 {
154 return v[i];
155 }
156
157 // Set Point Values
191
192 vec2d& set_xy( double xx, double yy );
193
226
227 vec2d& set_x( double xx );
228
261
262 vec2d& set_y( double yy );
263
264 // Get Point Values
288
289 double x() const;
290
314
315 double y() const;
316
322 double* data()
323 {
324 return( v );
325 }
326
332 vec2d transform( float mat[3][3] );
333 vec2d transform( double mat[3][3] );
334
369
370 friend vec2d operator+( const vec2d& a, const vec2d& b );
371
406
407 friend vec2d operator-( const vec2d& a, const vec2d& b );
408
441
442 friend vec2d operator*( const vec2d& a, double b );
443 friend vec2d operator*( double b, const vec2d& a );
444
481
482 friend vec2d operator*( const vec2d& a, const vec2d& b );
483
516
517 friend vec2d operator/( const vec2d& a, double b );
518 vec2d& operator+=( const vec2d& b );
519 vec2d& operator-=( const vec2d& b );
520 vec2d& operator*=( double b );
521
549
550 friend double dist( const vec2d& a, const vec2d& b );
551
580
581 friend double dist_squared( const vec2d& a, const vec2d& b );
582
606
607 double mag() const; // x = a.mag()
608
639
640 void normalize(); // a.normalize()
641
674
675 friend double cross( const vec2d& a, const vec2d& b );
676
704
705 friend double dot( const vec2d& a, const vec2d& b ); // x = dot(a,b)
706
738
739 friend double angle( const vec2d& a, const vec2d& b );
740
773
774 friend double cos_angle( const vec2d& a, const vec2d& b );
775
822
823 friend int seg_seg_intersect( const vec2d& pnt_A, const vec2d& pnt_B, const vec2d& pnt_C, const vec2d& pnt_D, vec2d& int_pnt, double &t1, double &t2 );
824
864
865 friend vec2d proj_pnt_on_line_seg( const vec2d& line_A, const vec2d& line_B, const vec2d& pnt );
866
895
896 friend double proj_pnt_on_line_u( const vec2d& line_A, const vec2d& line_B, const vec2d& pnt );
897
903 friend void encode( double x_min, double y_min, double x_max, double y_max,
904 const vec2d& pnt, int code[4] );
905 friend void clip_seg_rect( double x_min, double y_min, double x_max, double y_max,
906 vec2d& pnt1, vec2d& pnt2, int& visible );
907
938
939 friend bool PointInPolygon( const vec2d & R, const std::vector< vec2d > & pnts );
940
968
969 friend double det( const vec2d & p0, const vec2d & p1, const vec2d & offset );
970
997
998 friend double poly_area( const std::vector< vec2d > & pnt_vec );
999
1033
1034 friend vec2d poly_centroid( const std::vector< vec2d > & pnt_vec );
1035
1063
1064 friend double orient2d( const vec2d & p0, const vec2d & p1, const vec2d & p );
1065
1107
1108 friend void bi_lin_interp( const vec2d &p0, const vec2d &p1, const vec2d &p2, vec2d const &p3, double s, double t, vec2d &p_out );
1109
1166
1167 friend int inverse_bi_lin_interp( const vec2d &p0, const vec2d &p1, const vec2d &p2, vec2d const &p3, const vec2d &p, double &s, double &t, double &s2, double &t2 );
1168};
1169
1170#endif
Definition Vec2d.h:62
friend void bi_lin_interp(const vec2d &p0, const vec2d &p1, const vec2d &p2, vec2d const &p3, double s, double t, vec2d &p_out)
friend double cross(const vec2d &a, const vec2d &b)
vec2d & set_xy(double xx, double yy)
friend vec2d operator*(const vec2d &a, double b)
friend double cos_angle(const vec2d &a, const vec2d &b)
double x() const
friend double dot(const vec2d &a, const vec2d &b)
friend vec2d operator-(const vec2d &a, const vec2d &b)
friend double poly_area(const std::vector< vec2d > &pnt_vec)
vec2d & set_y(double yy)
friend vec2d poly_centroid(const std::vector< vec2d > &pnt_vec)
friend int inverse_bi_lin_interp(const vec2d &p0, const vec2d &p1, const vec2d &p2, vec2d const &p3, const vec2d &p, double &s, double &t, double &s2, double &t2)
vec2d(double xx, double yy)
friend double dist(const vec2d &a, const vec2d &b)
double mag() const
friend double det(const vec2d &p0, const vec2d &p1, const vec2d &offset)
friend vec2d operator+(const vec2d &a, const vec2d &b)
friend double proj_pnt_on_line_u(const vec2d &line_A, const vec2d &line_B, const vec2d &pnt)
double y() const
double & operator[](int i)
Definition Vec2d.h:148
friend double dist_squared(const vec2d &a, const vec2d &b)
friend vec2d operator*(const vec2d &a, const vec2d &b)
void normalize()
friend int seg_seg_intersect(const vec2d &pnt_A, const vec2d &pnt_B, const vec2d &pnt_C, const vec2d &pnt_D, vec2d &int_pnt, double &t1, double &t2)
vec2d & set_x(double xx)
friend double angle(const vec2d &a, const vec2d &b)
friend double orient2d(const vec2d &p0, const vec2d &p1, const vec2d &p)
friend vec2d operator/(const vec2d &a, double b)
friend bool PointInPolygon(const vec2d &R, const std::vector< vec2d > &pnts)
friend vec2d proj_pnt_on_line_seg(const vec2d &line_A, const vec2d &line_B, const vec2d &pnt)
vec3d operator-(const vec3d &a, const vec3d &b)
double dot(const vec3d &a, const vec3d &b)
vec3d operator+(const vec3d &a, const vec3d &b)
vec3d operator*(const vec3d &a, double b)
vec3d operator/(const vec3d &a, double b)
vec3d cross(const vec3d &a, const vec3d &b)
double angle(const vec3d &a, const vec3d &b)
double dist(const vec3d &a, const vec3d &b)
double cos_angle(const vec3d &a, const vec3d &b)
double dist_squared(const vec3d &a, const vec3d &b)