square_cut.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. #include "square_cut.h"
  2. void OhodnotVrchol(int x, int y, SQUARE * pOblast, OHODNOCENI * pOhodnot)
  3. {
  4. if (x < pOblast->left)
  5. pOhodnot->horizontal = -1;
  6. else if (x > pOblast->right)
  7. pOhodnot->horizontal = 1;
  8. else
  9. pOhodnot->horizontal = 0;
  10. if (y < pOblast->top)
  11. pOhodnot->vertikal = -1;
  12. else if (y > pOblast->bottom)
  13. pOhodnot->vertikal = 1;
  14. else
  15. pOhodnot->vertikal = 0;
  16. return;
  17. }
  18. void KorigujSouracniciX(int *x, SQUARE * pOblast, OHODNOCENI * pOhodnot)
  19. {
  20. if (pOhodnot->horizontal == -1)
  21. *x = pOblast->left;
  22. else if (pOhodnot->horizontal == 1)
  23. *x = pOblast->right;
  24. }
  25. void KorigujSouracniciY(int *y, SQUARE * pOblast, OHODNOCENI * pOhodnot)
  26. {
  27. if (pOhodnot->vertikal == -1)
  28. *y = pOblast->top;
  29. else if (pOhodnot->vertikal == 1)
  30. *y = pOblast->bottom;
  31. }
  32. void OrezCtverec(SQUARE * pCtverec, SQUARE * pOblast)
  33. {
  34. OHODNOCENI TopLeft;
  35. OHODNOCENI BottomRight;
  36. OhodnotVrchol(pCtverec->left, pCtverec->top, pOblast, &TopLeft);
  37. OhodnotVrchol(pCtverec->right, pCtverec->bottom, pOblast, &BottomRight);
  38. KorigujSouracniciX(&pCtverec->left, pOblast, &TopLeft);
  39. KorigujSouracniciX(&pCtverec->right, pOblast, &BottomRight);
  40. KorigujSouracniciY(&pCtverec->top, pOblast, &TopLeft);
  41. KorigujSouracniciY(&pCtverec->bottom, pOblast, &BottomRight);
  42. }
  43. char OhodnotCtverec(SQUARE * pCtverec, SQUARE * pOblast)
  44. {
  45. OHODNOCENI TopLeft;
  46. OHODNOCENI BottomRight;
  47. OHODNOCENI TopRight;
  48. OHODNOCENI BottomLeft;
  49. OhodnotVrchol(pCtverec->left, pCtverec->top, pOblast, &TopLeft);
  50. OhodnotVrchol(pCtverec->right, pCtverec->top, pOblast, &TopRight);
  51. OhodnotVrchol(pCtverec->right, pCtverec->bottom, pOblast, &BottomRight);
  52. OhodnotVrchol(pCtverec->left, pCtverec->bottom, pOblast, &BottomLeft);
  53. //jeden a vice vrcholu v oblasti
  54. if ((!TopLeft.horizontal && !TopLeft.vertikal) ||
  55. (!BottomRight.horizontal && !BottomRight.vertikal) ||
  56. (!TopRight.horizontal && !TopRight.vertikal) ||
  57. (!BottomLeft.horizontal && !BottomLeft.vertikal))
  58. return 1;
  59. else
  60. //horizontalni protnuti oblasti
  61. if (!TopLeft.vertikal && !TopRight.vertikal &&
  62. !BottomRight.vertikal && !BottomLeft.vertikal &&
  63. TopLeft.horizontal == -1 && BottomLeft.horizontal == -1 &&
  64. TopRight.horizontal == 1 && BottomRight.horizontal == 1)
  65. return 1;
  66. else
  67. //vertikalni protnuti oblasti
  68. if (TopLeft.vertikal == -1 && TopRight.vertikal == -1 &&
  69. BottomRight.vertikal == 1 && BottomLeft.vertikal == 1 &&
  70. !TopLeft.horizontal && !BottomLeft.horizontal &&
  71. !TopRight.horizontal && !BottomRight.horizontal)
  72. return 1;
  73. else
  74. //oblast je ve ctverci
  75. if (TopLeft.horizontal == -1 && TopLeft.vertikal == -1 &&
  76. TopRight.horizontal == 1 && TopRight.vertikal == -1 &&
  77. BottomLeft.horizontal == -1 && BottomLeft.vertikal == 1 &&
  78. BottomRight.horizontal == 1 && BottomRight.vertikal == 1)
  79. return 1;
  80. else
  81. //oblast prekryva kurzor zhora
  82. if (TopLeft.horizontal == -1 && TopLeft.vertikal == -1 &&
  83. TopRight.horizontal == 1 && TopRight.vertikal == -1 &&
  84. BottomLeft.horizontal == -1 && !BottomLeft.vertikal &&
  85. BottomRight.horizontal == 1 && !BottomRight.vertikal)
  86. return 1;
  87. else
  88. //oblast prekryva kurzor ze spoda
  89. if (TopLeft.horizontal == -1 && !TopLeft.vertikal &&
  90. TopRight.horizontal == 1 && !TopRight.vertikal &&
  91. BottomLeft.horizontal == -1 && BottomLeft.vertikal == 1 &&
  92. BottomRight.horizontal == 1 && BottomRight.vertikal == 1)
  93. return 1;
  94. else
  95. //oblast prekryva kurzor z leva
  96. if (TopLeft.horizontal == -1 && TopLeft.vertikal == -1 &&
  97. !TopRight.horizontal && TopRight.vertikal == -1 &&
  98. BottomLeft.horizontal == -1 && BottomLeft.vertikal == 1 &&
  99. !BottomRight.horizontal && BottomRight.vertikal == 1)
  100. return 1;
  101. else
  102. //oblast prekryva kurzor z prava
  103. if (!TopLeft.horizontal && TopLeft.vertikal == -1 &&
  104. TopRight.horizontal == 1 && TopRight.vertikal == -1 &&
  105. !BottomLeft.horizontal && BottomLeft.vertikal == 1 &&
  106. BottomRight.horizontal == 1 && BottomRight.vertikal == 1)
  107. return 1;
  108. return 0;
  109. }