00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef POINTS_H
00021 #define POINTS_H
00022
00023 #include <stdio.h>
00024 #include <math.h>
00025 #include "elst.h"
00026
00027
00028 class FCOORD;
00029
00030 class DLLSYM ICOORD
00031 {
00032 friend class FCOORD;
00033
00034 public:
00035 ICOORD() {
00036 xcoord = ycoord = 0;
00037 }
00038 ICOORD(
00039 inT16 xin,
00040 inT16 yin) {
00041 xcoord = xin;
00042 ycoord = yin;
00043 }
00044 ~ICOORD () {
00045 }
00046
00047
00048 NEWDELETE2 (ICOORD) inT16 x () const
00049 {
00050 return xcoord;
00051 }
00052 inT16 y() const {
00053 return ycoord;
00054 }
00055
00056 void set_x(
00057 inT16 xin) {
00058 xcoord = xin;
00059 }
00060 void set_y(
00061 inT16 yin) {
00062 ycoord = yin;
00063 }
00064
00065
00066 void set_with_shrink(int x, int y);
00067
00068 float sqlength() const {
00069 return (float) (xcoord * xcoord + ycoord * ycoord);
00070 }
00071
00072 float length() const {
00073 return (float) sqrt (sqlength ());
00074 }
00075
00076 float pt_to_pt_sqdist(
00077 const ICOORD &pt) const {
00078 ICOORD gap;
00079
00080 gap.xcoord = xcoord - pt.xcoord;
00081 gap.ycoord = ycoord - pt.ycoord;
00082 return gap.sqlength ();
00083 }
00084
00085 float pt_to_pt_dist(
00086 const ICOORD &pt) const {
00087 return (float) sqrt (pt_to_pt_sqdist (pt));
00088 }
00089
00090 float angle() const {
00091 return (float) atan2 ((double) ycoord, (double) xcoord);
00092 }
00093
00094 BOOL8 operator== (
00095 const ICOORD & other) {
00096 return xcoord == other.xcoord && ycoord == other.ycoord;
00097 }
00098 BOOL8 operator!= (
00099 const ICOORD & other) {
00100 return xcoord != other.xcoord || ycoord != other.ycoord;
00101 }
00102 friend ICOORD operator! (
00103 const ICOORD &);
00104 friend ICOORD operator- (
00105 const ICOORD &);
00106 friend ICOORD operator+ (
00107 const ICOORD &, const ICOORD &);
00108 friend ICOORD & operator+= (
00109 ICOORD &, const ICOORD &);
00110 friend ICOORD operator- (
00111 const ICOORD &, const ICOORD &);
00112 friend ICOORD & operator-= (
00113 ICOORD &, const ICOORD &);
00114 friend inT32 operator% (
00115 const ICOORD &, const ICOORD &);
00116 friend inT32 operator *(
00117 const ICOORD &,
00118 const ICOORD &);
00119 friend ICOORD operator *(
00120 const ICOORD &,
00121 inT16);
00122 friend ICOORD operator *(
00123 inT16,
00124 const ICOORD &);
00125 friend ICOORD & operator*= (
00126 ICOORD &, inT16);
00127 friend ICOORD operator/ (
00128 const ICOORD &, inT16);
00129
00130 friend ICOORD & operator/= (ICOORD &, inT16);
00131 void rotate(
00132 const FCOORD& vec);
00133
00134
00135
00136
00137
00138
00139 void setup_render(ICOORD* major_step, ICOORD* minor_step,
00140 int* major, int* minor) const;
00141
00142 void serialise_asc(
00143 FILE *f);
00144 void de_serialise_asc(
00145 FILE *f);
00146
00147 protected:
00148 inT16 xcoord;
00149 inT16 ycoord;
00150 };
00151
00152 class DLLSYM ICOORDELT:public ELIST_LINK, public ICOORD
00153
00154 {
00155 public:
00156 ICOORDELT() {
00157 }
00158 ICOORDELT (
00159
00160 ICOORD icoord):ICOORD (icoord) {
00161 }
00162 ICOORDELT(
00163 inT16 xin,
00164 inT16 yin) {
00165 xcoord = xin;
00166 ycoord = yin;
00167 }
00168
00169
00170
00171
00172 void prep_serialise() const {
00173 }
00174
00175 void dump(
00176 FILE *) const {
00177 }
00178
00179 void de_dump(
00180 FILE *) {
00181 }
00182
00183
00184 make_serialise(ICOORDELT)
00185
00186 static ICOORDELT* deep_copy(const ICOORDELT* src) {
00187 ICOORDELT* elt = new ICOORDELT;
00188 *elt = *src;
00189 return elt;
00190 }
00191
00192 void serialise_asc(FILE * f);
00193 void de_serialise_asc(
00194 FILE *f);
00195
00196 };
00197
00198 ELISTIZEH_S (ICOORDELT)
00199 class DLLSYM FCOORD
00200 {
00201 public:
00202 FCOORD() {
00203 }
00204 FCOORD(
00205 float xvalue,
00206 float yvalue) {
00207 xcoord = xvalue;
00208 ycoord = yvalue;
00209 }
00210 FCOORD(
00211 ICOORD icoord) {
00212 xcoord = icoord.xcoord;
00213 ycoord = icoord.ycoord;
00214 }
00215
00216 float x() const {
00217 return xcoord;
00218 }
00219 float y() const {
00220 return ycoord;
00221 }
00222 void set_x(
00223 float xin) {
00224 xcoord = xin;
00225 }
00226 void set_y(
00227 float yin) {
00228 ycoord = yin;
00229 }
00230
00231 float sqlength() const {
00232 return xcoord * xcoord + ycoord * ycoord;
00233 }
00234
00235 float length() const {
00236 return (float) sqrt (sqlength ());
00237 }
00238
00239 float pt_to_pt_sqdist(
00240 const FCOORD &pt) const {
00241 FCOORD gap;
00242
00243 gap.xcoord = xcoord - pt.xcoord;
00244 gap.ycoord = ycoord - pt.ycoord;
00245 return gap.sqlength ();
00246 }
00247
00248 float pt_to_pt_dist(
00249 const FCOORD &pt) const {
00250 return (float) sqrt (pt_to_pt_sqdist (pt));
00251 }
00252
00253 float angle() const {
00254 return (float) atan2 (ycoord, xcoord);
00255 }
00256
00257 bool normalise();
00258
00259 BOOL8 operator== (
00260 const FCOORD & other) {
00261 return xcoord == other.xcoord && ycoord == other.ycoord;
00262 }
00263 BOOL8 operator!= (
00264 const FCOORD & other) {
00265 return xcoord != other.xcoord || ycoord != other.ycoord;
00266 }
00267
00268 friend FCOORD operator! (const FCOORD &);
00269
00270 friend FCOORD operator- (const FCOORD &);
00271
00272 friend FCOORD operator+ (const FCOORD &, const FCOORD &);
00273
00274 friend FCOORD & operator+= (FCOORD &, const FCOORD &);
00275
00276 friend FCOORD operator- (const FCOORD &, const FCOORD &);
00277
00278 friend FCOORD & operator-= (FCOORD &, const FCOORD &);
00279
00280 friend float operator% (const FCOORD &, const FCOORD &);
00281
00282 friend float operator *(const FCOORD &, const FCOORD &);
00283 friend FCOORD operator *(const FCOORD &, float);
00284
00285 friend FCOORD operator *(float, const FCOORD &);
00286
00287
00288 friend FCOORD & operator*= (FCOORD &, float);
00289 friend FCOORD operator/ (const FCOORD &, float);
00290
00291 void rotate(
00292 const FCOORD vec);
00293
00294 friend FCOORD & operator/= (FCOORD &, float);
00295
00296 private:
00297 float xcoord;
00298 float ycoord;
00299 };
00300
00301 #include "ipoints.h"
00302 #endif