Model2D.cpp 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727
  1. #include "Model2D.h"
  2. #include "Bild.h"
  3. #include "FrameworkMath.h"
  4. #include "Mat3.h"
  5. #include "MausEreignis.h"
  6. using namespace Framework;
  7. // Inhalt der Model2DData Klasse aus Model2D.h
  8. // Konstruktor
  9. Model2DData::Model2DData()
  10. : polygons( 0 ),
  11. vListen( 0 ),
  12. minP( 0, 0 ),
  13. maxP( 0, 0 )
  14. {
  15. ref = 1;
  16. }
  17. // Destruktor
  18. Model2DData::~Model2DData()
  19. {
  20. if( polygons )
  21. {
  22. int anz = polygons->getEintragAnzahl();
  23. for( int i = 0; i < anz; i++ )
  24. {
  25. if( polygons->get( i ).name )
  26. polygons->get( i ).name->release();
  27. if( polygons->get( i ).tKordinaten )
  28. polygons->get( i ).tKordinaten->release();
  29. if( polygons->get( i ).vertex )
  30. polygons->get( i ).vertex->release();
  31. }
  32. polygons = polygons->release();
  33. }
  34. if( vListen )
  35. vListen->release();
  36. }
  37. // privat
  38. bool Model2DData::istPunktInnen( Vertex p, int polygonId ) const
  39. {
  40. if( p < minP || p > maxP || !polygons )
  41. return 0;
  42. int num = 0;
  43. for( auto *polygon = &polygons->getArray(); polygon && polygon->set; polygon = polygon->next, num++ )
  44. {
  45. if( polygonId >= 0 && num != polygonId )
  46. continue;
  47. int anz = polygon->var.vertex->getEintragAnzahl();
  48. int ola = outList.z( num )->getEintragAnzahl();
  49. bool c = 0;
  50. int j = anz - 1;
  51. for( int k = 0; k < ola; k++ )
  52. {
  53. Punkt out = outList.z( num )->get( k );
  54. if( out.x < out.y && j > out.x && j < out.y )
  55. j = out.x;
  56. if( out.x > out.y && ( j > out.x || j < out.y ) )
  57. j = out.x;
  58. }
  59. for( int i = 0; i < anz; i++ )
  60. {
  61. bool cont = 0;
  62. for( int k = 0; k < ola; k++ )
  63. {
  64. Punkt out = outList.z( num )->get( k );
  65. if( out.x < out.y && i > out.x && i < out.y )
  66. cont = 1;
  67. if( out.x > out.y && ( i > out.x || i < out.y ) )
  68. cont = 1;
  69. }
  70. if( cont )
  71. continue;
  72. Vertex a = polygon->var.vertex->get( i );
  73. Vertex b = polygon->var.vertex->get( j );
  74. if( ( ( a.y >= p.y ) != ( b.y >= p.y ) ) && ( p.x <= ( b.x - a.x ) * ( p.y - a.y ) / (float)( b.y - a.y ) + a.x ) )
  75. c = !c;
  76. j = i;
  77. }
  78. if( c )
  79. return 1;
  80. }
  81. return 0;
  82. }
  83. bool Model2DData::istLinieInnen( Vertex a, Vertex b, int polygonId ) const
  84. {
  85. if( !polygons )
  86. return 0;
  87. int pAnz = polygons->getEintragAnzahl();
  88. for( int p = 0; p < pAnz; p++ )
  89. {
  90. if( polygonId >= 0 && p != polygonId )
  91. continue;
  92. int ola = outList.z( p )->getEintragAnzahl();
  93. int anz = polygons->get( p ).vertex->getEintragAnzahl();
  94. int j = anz - 1;
  95. for( int k = 0; k < ola; k++ )
  96. {
  97. Punkt out = outList.z( p )->get( k );
  98. if( out.x < out.y && j > out.x && j < out.y )
  99. j = out.x;
  100. if( out.x > out.y && ( j > out.x || j < out.y ) )
  101. j = out.x;
  102. }
  103. for( int i = 0; i < anz; i++ )
  104. {
  105. bool cont = 0;
  106. for( int k = 0; k < ola; k++ )
  107. {
  108. Punkt out = outList.z( p )->get( k );
  109. if( out.x < out.y && i > out.x && i < out.y )
  110. cont = 1;
  111. if( out.x > out.y && ( i > out.x || i < out.y ) )
  112. cont = 1;
  113. }
  114. if( cont )
  115. continue;
  116. Punkt va = polygons->get( p ).vertex->get( i );
  117. Punkt vb = polygons->get( p ).vertex->get( j );
  118. if( (Punkt)a == va && (Punkt)b == vb )
  119. return 1;
  120. if( (Punkt)a == vb && (Punkt)b == va )
  121. return 1;
  122. j = i;
  123. }
  124. Vertex len = b - a;
  125. Vertex speed( len.x > 0 ? 1 : -1.f, len.y > 0 ? 1 : -1.f );
  126. int mLen = 0;
  127. if( fabs( len.x ) > fabs( len.y ) )
  128. {
  129. mLen = (int)fabs( len.x );
  130. speed.y = len.y / (float)fabs( len.x );
  131. }
  132. else
  133. {
  134. mLen = (int)fabs( len.y );
  135. speed.x = len.x / (float)fabs( len.y );
  136. }
  137. int i = 1;
  138. bool inside = 1;
  139. for( Vertex vp = speed + a; (Punkt)vp != (Punkt)( b - speed ) && inside && i < mLen - 1; vp += speed, i++ )
  140. inside &= istPunktInnen( vp, p );
  141. if( inside )
  142. return 1;
  143. }
  144. return 0;
  145. }
  146. // nicht constant
  147. bool Model2DData::erstelleModell( Array< Polygon2D > *polygons )
  148. {
  149. removeModell();
  150. if( !polygons || !polygons->getEintragAnzahl() )
  151. {
  152. this->polygons = polygons;
  153. vListen = new RCArray< RCArray< DreieckListe< Vertex > > >();
  154. return 1;
  155. }
  156. this->polygons = polygons;
  157. int pAnz = polygons->getEintragAnzahl();
  158. vListen = new RCArray< RCArray< DreieckListe< Vertex > > >();
  159. for( int p = 0; p < pAnz; p++ )
  160. {
  161. Polygon2D pg = polygons->get( p );
  162. if( !pg.vertex || pg.vertex->getEintragAnzahl() < 3 )
  163. continue;
  164. vListen->add( new RCArray< DreieckListe< Vertex > >() );
  165. outList.set( new Array< Punkt >, p );
  166. int vAnz = pg.vertex->getEintragAnzahl();
  167. bool textur = pg.tKordinaten != 0;
  168. for( int i = 0; i < vAnz && textur; i++ )
  169. textur &= pg.tKordinaten->hat( i );
  170. for( int i = 0; i < vAnz; i++ )
  171. {
  172. if( maxP.x < fabs( pg.vertex->get( i ).x ) )
  173. maxP.x = abs( (int)pg.vertex->get( i ).x ) + 1;
  174. if( maxP.y < fabs( pg.vertex->get( i ).y ) )
  175. maxP.y = abs( (int)pg.vertex->get( i ).y ) + 1;
  176. }
  177. minP = -maxP;
  178. if( !textur )
  179. {
  180. if( pg.tKordinaten )
  181. pg.tKordinaten->leeren();
  182. }
  183. RCArray< RCArray< DreieckListe< Vertex > > > lists;
  184. int lauf = 0;
  185. while( 1 )
  186. {
  187. lists.set( new RCArray< DreieckListe< Vertex > >(), lauf );
  188. outList.z( p )->set( Punkt( 0, 0 ), lauf );
  189. bool fertig = 0;
  190. Vertex a;
  191. Vertex b;
  192. Array< Punkt > tmpOutList;
  193. for( int i = 0; i < vAnz; i++ )
  194. {
  195. bool cont = 0;
  196. int vorher = i - 1;
  197. int nachher = i + 1;
  198. if( nachher >= vAnz )
  199. nachher = 0;
  200. if( vorher < 0 )
  201. vorher = vAnz - 1;
  202. int ola = outList.z( p )->getEintragAnzahl();
  203. for( int j = 0; j < ola; j++ )
  204. {
  205. Punkt out = outList.z( p )->get( j );
  206. if( out.x < out.y )
  207. {
  208. if( nachher > out.x && nachher < out.y )
  209. nachher = out.y;
  210. if( vorher > out.x && vorher < out.y )
  211. vorher = out.x;
  212. }
  213. if( out.x > out.y )
  214. {
  215. if( nachher > out.x || nachher < out.y )
  216. nachher = out.y;
  217. if( vorher > out.x || vorher < out.y )
  218. vorher = out.x;
  219. }
  220. if( out.x < out.y && i > out.x && i < out.y )
  221. cont = 1;
  222. if( out.x > out.y && ( i > out.x || i < out.y ) )
  223. cont = 1;
  224. }
  225. if( cont )
  226. continue;
  227. if( vorher < 0 )
  228. a = pg.vertex->get( vAnz + vorher );
  229. else
  230. a = pg.vertex->get( vorher );
  231. if( nachher > vAnz - 1 )
  232. b = pg.vertex->get( nachher - vAnz + 1 );
  233. else
  234. b = pg.vertex->get( nachher );
  235. if( istLinieInnen( a, b, p ) )
  236. {
  237. DreieckListe< Vertex > *lowL = new DreieckListe< Vertex >();
  238. DreieckListe< Vertex > *heightL = new DreieckListe< Vertex >();
  239. lowL->addPunkt( new Vertex( pg.vertex->get( i ) ), textur ? new Punkt( pg.tKordinaten->get( i ) ) : 0 );
  240. heightL->addPunkt( new Vertex( pg.vertex->get( i ) ), textur ? new Punkt( pg.tKordinaten->get( i ) ) : 0 );
  241. int height = i + 1;
  242. int low = i - 1;
  243. Punkt outL( 0, 0 );
  244. Punkt outH( 0, 0 );
  245. for( int k = 0; k < 2; k++ )
  246. {
  247. bool lowp = !k;
  248. while( 1 )
  249. {
  250. if( height >= vAnz )
  251. height = 0;
  252. if( low < 0 )
  253. low = vAnz - 1;
  254. for( int j = 0; j <= lauf; j++ )
  255. {
  256. Punkt out = outList.z( p )->get( j );
  257. if( out.x < out.y )
  258. {
  259. if( height > out.x && height < out.y )
  260. height = out.y;
  261. if( low > out.x && low < out.y )
  262. low = out.x;
  263. }
  264. if( out.x > out.y )
  265. {
  266. if( height > out.x || height < out.y )
  267. height = out.y;
  268. if( low > out.x || low < out.y )
  269. low = out.x;
  270. }
  271. }
  272. Vertex a = pg.vertex->get( height );
  273. Vertex b = pg.vertex->get( low );
  274. if( low == height )
  275. {
  276. fertig = 1;
  277. outList.z( p )->set( Punkt( 0, 0 ), lauf );
  278. if( !k )
  279. lowL->addPunkt( new Vertex( b ), textur ? new Punkt( pg.tKordinaten->get( low ) ) : 0 );
  280. else
  281. heightL->addPunkt( new Vertex( b ), textur ? new Punkt( pg.tKordinaten->get( low ) ) : 0 );
  282. break;
  283. }
  284. bool inside = istLinieInnen( a, b, p );
  285. if( inside )
  286. {
  287. if( !k )
  288. outL = Punkt( low, height );
  289. else
  290. outH = Punkt( low, height );
  291. outList.z( p )->set( Punkt( low, height ), lauf );
  292. }
  293. if( lowp )
  294. {
  295. if( !k )
  296. lowL->addPunkt( new Vertex( b ), textur ? new Punkt( pg.tKordinaten->get( low ) ) : 0 );
  297. else
  298. heightL->addPunkt( new Vertex( b ), textur ? new Punkt( pg.tKordinaten->get( low ) ) : 0 );
  299. low--;
  300. }
  301. else
  302. {
  303. if( !k )
  304. lowL->addPunkt( new Vertex( a ), textur ? new Punkt( pg.tKordinaten->get( height ) ) : 0 );
  305. else
  306. heightL->addPunkt( new Vertex( a ), textur ? new Punkt( pg.tKordinaten->get( height ) ) : 0 );
  307. height++;
  308. }
  309. lowp = !lowp;
  310. if( !inside )
  311. {
  312. height = i + 1;
  313. low = i - 1;
  314. outList.z( p )->set( Punkt( 0, 0 ), lauf );
  315. break;
  316. }
  317. }
  318. if( fertig )
  319. break;
  320. }
  321. if( lowL->getDreieckAnzahl() > heightL->getDreieckAnzahl() )
  322. {
  323. lists.z( lauf )->set( lowL, i );
  324. tmpOutList.set( outL, i );
  325. heightL->release();
  326. }
  327. else
  328. {
  329. lists.z( lauf )->set( heightL, i );
  330. tmpOutList.set( outH, i );
  331. lowL->release();
  332. }
  333. }
  334. else
  335. lists.z( lauf )->set( new DreieckListe< Vertex >(), i );
  336. if( fertig )
  337. break;
  338. }
  339. int maxP = -1;
  340. int max = 0;
  341. for( int i = 0; i < vAnz; i++ )
  342. {
  343. if( lists.z( lauf )->z( i ) && lists.z( lauf )->z( i )->getDreieckAnzahl() > max )
  344. {
  345. max = lists.z( lauf )->z( i )->getDreieckAnzahl();
  346. maxP = i;
  347. }
  348. }
  349. if( !max || maxP < 0 )
  350. break;
  351. vListen->z( p )->add( lists.z( lauf )->get( maxP ) );
  352. outList.z( p )->set( tmpOutList.get( maxP ), lauf );
  353. if( fertig )
  354. break;
  355. lauf++;
  356. }
  357. outList.z( p )->leeren();
  358. }
  359. return 1;
  360. }
  361. void Model2DData::removeModell() // setzt die Vertex daten zurück
  362. {
  363. if( polygons )
  364. {
  365. int anz = polygons->getEintragAnzahl();
  366. for( int i = 0; i < anz; i++ )
  367. {
  368. if( polygons->get( i ).name )
  369. polygons->get( i ).name->release();
  370. if( polygons->get( i ).tKordinaten )
  371. polygons->get( i ).tKordinaten->release();
  372. if( polygons->get( i ).vertex )
  373. polygons->get( i ).vertex->release();
  374. }
  375. polygons = polygons->release();
  376. }
  377. if( vListen )
  378. vListen = vListen->release();
  379. outList.leeren();
  380. minP = Punkt( 0, 0 );
  381. maxP = Punkt( 0, 0 );
  382. }
  383. // Reference Counting
  384. Model2DData *Model2DData::getThis()
  385. {
  386. ref++;
  387. return this;
  388. }
  389. Model2DData *Model2DData::release()
  390. {
  391. ref--;
  392. if( !ref )
  393. delete this;
  394. return 0;
  395. }
  396. // Inhalt der Model2D Klasse aus Model2D.h
  397. // Konstruktor
  398. Model2D::Model2D()
  399. : Zeichnung(),
  400. textur( 0 )
  401. {
  402. farbe = 0;
  403. style = 0;
  404. rData = 0;
  405. drehung = 0;
  406. size = 1;
  407. ref = 1;
  408. }
  409. // Destruktor
  410. Model2D::~Model2D()
  411. {
  412. if( rData )
  413. rData->release();
  414. if( textur )
  415. textur->release();
  416. }
  417. // nicht constant
  418. void Model2D::setModel( Model2DData *mdl )
  419. {
  420. if( rData )
  421. rData->release();
  422. rData = mdl;
  423. }
  424. void Model2D::setDrehung( float drehung )
  425. {
  426. this->drehung = drehung;
  427. while( this->drehung > PI * 2 )
  428. this->drehung -= (float)PI * 2;
  429. while( this->drehung < 0 )
  430. this->drehung += (float)PI * 2;
  431. rend = 1;
  432. }
  433. void Model2D::addDrehung( float drehung )
  434. {
  435. this->drehung += drehung;
  436. while( this->drehung > PI * 2 )
  437. this->drehung -= (float)PI * 2;
  438. while( this->drehung < 0 )
  439. this->drehung += (float)PI * 2;
  440. rend = 1;
  441. }
  442. void Model2D::setSize( float size )
  443. {
  444. this->size = size;
  445. rend = 1;
  446. }
  447. void Model2D::addSize( float size )
  448. {
  449. this->size += size;
  450. rend = 1;
  451. }
  452. void Model2D::setTextur( Bild *t )
  453. {
  454. if( textur )
  455. textur->release();
  456. textur = t;
  457. }
  458. void Model2D::setFarbe( int f )
  459. {
  460. farbe = f;
  461. rend = 1;
  462. }
  463. void Model2D::doMausEreignis( MausEreignis &me )
  464. {
  465. if( !mak || me.verarbeitet || !istPunktInnen( Punkt( me.mx, me.my ) ) )
  466. return;
  467. me.mx -= pos.x;
  468. me.my -= pos.y;
  469. mak( makParam, this, me );
  470. me.mx += pos.x;
  471. me.my += pos.y;
  472. me.verarbeitet = 1;
  473. }
  474. bool Model2D::tick( double tickVal )
  475. {
  476. bool ret = rend;
  477. rend = 0;
  478. return ret;
  479. }
  480. void Model2D::render( Bild &zRObj )
  481. {
  482. if( !rData || hatStyleNicht( Model2D::Style::Sichtbar ) || !rData->polygons )
  483. return;
  484. Zeichnung::render( zRObj );
  485. int num = 0;
  486. for( auto *p = &rData->vListen->getArray(); p && p->set; p = p->next, num++ )
  487. {
  488. Mat3< float > mat = Mat3< float >::translation( pos ) * Mat3< float >::rotation( drehung ) * Mat3< float >::scaling( size );
  489. if( hatStyle( Model2D::Style::Textur ) )
  490. {
  491. if( !textur || !rData->polygons->get( num ).tKordinaten )
  492. {
  493. for( auto *i = &p->var->getArray(); i && i->set; i = i->next )
  494. {
  495. for( auto *j = &i->var->zListe()->getArray(); j->next->next && j->next->next->set; j = j->next )
  496. {
  497. Vertex a = mat * *j->var->punkt;
  498. Vertex b = mat * *j->next->var->punkt;
  499. Vertex c = mat * *j->next->next->var->punkt;
  500. if( hatStyle( Model2D::Style::Alpha ) )
  501. zRObj.drawDreieckAlpha( a, b, c, farbe );
  502. else
  503. zRObj.drawDreieck( a, b, c, farbe );
  504. }
  505. }
  506. }
  507. else
  508. {
  509. for( auto *i = &p->var->getArray(); i && i->set; i = i->next )
  510. {
  511. for( auto *j = &i->var->zListe()->getArray(); j->next->next && j->next->next->set; j = j->next )
  512. {
  513. Vertex a = mat * *j->var->punkt;
  514. Vertex b = mat * *j->next->var->punkt;
  515. Vertex c = mat * *j->next->next->var->punkt;
  516. if( hatStyle( Model2D::Style::Alpha ) )
  517. zRObj.drawDreieckTexturAlpha( a, b, c, *j->var->textur, *j->next->var->textur, *j->next->next->var->textur, *textur );
  518. else
  519. zRObj.drawDreieckTextur( a, b, c, *j->var->textur, *j->next->var->textur, *j->next->next->var->textur, *textur );
  520. }
  521. }
  522. }
  523. }
  524. if( hatStyle( Model2D::Style::Mesh ) )
  525. {
  526. for( auto *i = &p->var->getArray(); i && i->set; i = i->next )
  527. {
  528. for( auto *j = &i->var->zListe()->getArray(); j->next->next && j->next->next->set; j = j->next )
  529. {
  530. Vertex a = mat * *j->var->punkt;
  531. Vertex b = mat * *j->next->var->punkt;
  532. Vertex c = mat * *j->next->next->var->punkt;
  533. if( hatStyle( Model2D::Style::Alpha ) )
  534. {
  535. zRObj.drawLinieAlpha( a, b, farbe );
  536. zRObj.drawLinieAlpha( b, c, farbe );
  537. zRObj.drawLinieAlpha( c, a, farbe );
  538. }
  539. else
  540. {
  541. zRObj.drawLinie( a, b, farbe );
  542. zRObj.drawLinie( b, c, farbe );
  543. zRObj.drawLinie( c, a, farbe );
  544. }
  545. }
  546. }
  547. }
  548. if( hatStyle( Model2D::Style::Rahmen ) )
  549. {
  550. ArrayEintrag< Vertex > &beg = rData->polygons->get( num ).vertex->getArray();
  551. if( beg.set )
  552. {
  553. ArrayEintrag< Vertex > *letzter = 0;
  554. for( ArrayEintrag< Vertex > *e = &beg; e && e->next && e->set && e->next->set; e = e->next )
  555. {
  556. if( hatStyle( Model2D::Style::Alpha ) )
  557. zRObj.drawLinieAlpha( mat * e->var, mat * e->next->var, farbe );
  558. else
  559. zRObj.drawLinie( mat * e->var, mat * e->next->var, farbe );
  560. letzter = e->next;
  561. }
  562. if( letzter && letzter->set )
  563. {
  564. if( hatStyle( Model2D::Style::Alpha ) )
  565. zRObj.drawLinieAlpha( mat * letzter->var, mat * beg.var, farbe );
  566. else
  567. zRObj.drawLinie( mat * letzter->var, mat * beg.var, farbe );
  568. }
  569. }
  570. }
  571. }
  572. }
  573. // constant
  574. float Model2D::getDrehung() const
  575. {
  576. return drehung;
  577. }
  578. float Model2D::getSize() const
  579. {
  580. return size;
  581. }
  582. bool Model2D::istPunktInnen( Vertex p ) const
  583. {
  584. if( !rData )
  585. return 0;
  586. p -= pos;
  587. if( p < Mat3< float >::scaling( size ) * rData->minP || p > Mat3< float >::scaling( size ) * rData->maxP || !rData->polygons )
  588. return 0;
  589. int num = 0;
  590. for( auto *polygon = &rData->polygons->getArray(); polygon && polygon->set; polygon = polygon->next, num++ )
  591. {
  592. Mat3< float > mat = Mat3< float >::rotation( drehung ) * Mat3< float >::scaling( size );
  593. int anz = polygon->var.vertex->getEintragAnzahl();
  594. bool c = 0;
  595. int j = anz - 1;
  596. for( int i = 0; i < anz; i++ )
  597. {
  598. Vertex a = mat * polygon->var.vertex->get( i );
  599. Vertex b = mat * polygon->var.vertex->get( j );
  600. if( ( ( a.y >= p.y ) != ( b.y >= p.y ) ) && ( p.x <= ( b.x - a.x ) * ( p.y - a.y ) / (float)( b.y - a.y ) + a.x ) )
  601. c = !c;
  602. j = i;
  603. }
  604. if( c )
  605. return 1;
  606. }
  607. return 0;
  608. }
  609. bool Model2D::istLinieInnen( Vertex a, Vertex b ) const
  610. {
  611. if( !rData || !rData->polygons )
  612. return 0;
  613. int pAnz = rData->polygons->getEintragAnzahl();
  614. for( int p = 0; p < pAnz; p++ )
  615. {
  616. Mat3< float > mat = Mat3< float >::rotation( drehung ) * Mat3< float >::scaling( size );
  617. int anz = rData->polygons->get( p ).vertex->getEintragAnzahl();
  618. int j = anz - 1;
  619. for( int i = 0; i < anz; i++ )
  620. {
  621. Punkt va = mat * rData->polygons->get( p ).vertex->get( i );
  622. Punkt vb = mat * rData->polygons->get( p ).vertex->get( j );
  623. if( (Punkt)a == pos + va && (Punkt)b == pos + vb )
  624. return 1;
  625. if( (Punkt)a == pos + vb && (Punkt)b == pos + va )
  626. return 1;
  627. j = i;
  628. }
  629. Vertex len = b - a;
  630. Vertex speed( len.x > 0 ? 1 : -1.f, len.y > 0 ? 1 : -1.f );
  631. int mLen = 0;
  632. if( fabs( len.x ) > fabs( len.y ) )
  633. {
  634. mLen = (int)fabs( len.x );
  635. speed.y = len.y / (float)fabs( len.x );
  636. }
  637. else
  638. {
  639. mLen = (int)fabs( len.y );
  640. speed.x = len.x / (float)fabs( len.y );
  641. }
  642. int i = 1;
  643. bool inside = 1;
  644. for( Vertex vp = speed + a; (Punkt)vp != (Punkt)( b - speed ) && inside && i < mLen - 1; vp += speed, i++ )
  645. inside &= istPunktInnen( vp );
  646. if( inside )
  647. return 1;
  648. }
  649. return 0;
  650. }
  651. bool Model2D::istModelInnen( const Model2D *zMdl, bool end ) const
  652. {
  653. if( !end )
  654. {
  655. Vertex min = (Vertex)rData->minP * size + pos;
  656. Vertex max = (Vertex)rData->maxP * size + pos;
  657. Vertex min2 = (Vertex)zMdl->zModel()->minP * zMdl->getSize() + zMdl->getPosition();
  658. Vertex max2 = (Vertex)zMdl->zModel()->maxP * zMdl->getSize() + zMdl->getPosition();
  659. if( max.x < min2.x || min.x > max2.x || max.y < min2.y || min.y > max2.y )
  660. return 0;
  661. }
  662. Mat3< float > mat = Mat3< float >::translation( pos ) * Mat3< float >::rotation( drehung ) * Mat3< float >::scaling( size );
  663. for( auto *polygon = &rData->polygons->getArray(); polygon && polygon->set; polygon = polygon->next )
  664. {
  665. int anz = polygon->var.vertex->getEintragAnzahl();
  666. for( int i = 0; i < anz; i++ )
  667. {
  668. if( zMdl->istPunktInnen( mat * polygon->var.vertex->get( i ) ) )
  669. return 1;
  670. }
  671. }
  672. if( end )
  673. return 0;
  674. return zMdl->istModelInnen( this, 1 );
  675. }
  676. Model2DData *Model2D::getModel() const
  677. {
  678. return rData ? rData->getThis() : 0;
  679. }
  680. Model2DData *Model2D::zModel() const
  681. {
  682. return rData;
  683. }
  684. // Reference Counting
  685. Model2D *Model2D::getThis()
  686. {
  687. ++ref;
  688. return this;
  689. }
  690. Model2D *Model2D::release()
  691. {
  692. --ref;
  693. if( !ref )
  694. delete this;
  695. return 0;
  696. }