Advertisement
Guest User

Untitled

a guest
Nov 20th, 2017
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.36 KB | None | 0 0
  1.  
  2. #include <X11/Xlib.h>
  3. #include <X11/Xutil.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <math.h>
  7.  
  8. #define TRUE 1
  9. #define FALSE 0
  10. #define NORMAL_WIDTH 1
  11. #define CRAZY_WIDTH 4
  12. int red, green, blue, yellow;
  13. unsigned long foreground, background;
  14.  
  15.  
  16. struct line
  17. {
  18. unsigned int width;
  19. XPoint currentPosition;
  20. XPoint oldPosition;
  21. };
  22.  
  23.  
  24. //*************************************************************************************************************************
  25. //funkcja przydzielania kolorow
  26.  
  27. int AllocNamedColor(char *name, Display* display, Colormap colormap)
  28. {
  29. XColor col;
  30. XParseColor(display, colormap, name, &col);
  31. XAllocColor(display, colormap, &col);
  32. return col.pixel;
  33. }
  34.  
  35. //*************************************************************************************************************************
  36. // inicjalizacja zmiennych globalnych okreslajacych kolory
  37.  
  38. int init_colors(Display* display, int screen_no, Colormap colormap)
  39. {
  40. background = WhitePixel(display, screen_no); //niech tlo bedzie biale
  41. foreground = BlackPixel(display, screen_no); //niech ekran bedzie czarny
  42. red=AllocNamedColor("red", display, colormap);
  43. green=AllocNamedColor("green", display, colormap);
  44. blue=AllocNamedColor("blue", display, colormap);
  45. yellow=AllocNamedColor("yellow", display, colormap);
  46. }
  47.  
  48. //*************************************************************************************************************************
  49. // Glowna funkcja zawierajaca petle obslugujaca zdarzenia */
  50.  
  51. int main(int argc, char *argv[])
  52. {
  53. char icon_name[] = "Grafika";
  54. char title[] = "Grafika komputerowa";
  55. Display* display; //gdzie bedziemy wysylac dane (do jakiego X servera)
  56. Window window; //nasze okno, gdzie bedziemy dokonywac roznych operacji
  57. GC gc; //tu znajduja sie informacje o parametrach graficznych
  58. XEvent event; //gdzie bedziemy zapisywac pojawiajace sie zdarzenia
  59. KeySym key; //informacja o stanie klawiatury
  60. Colormap colormap;
  61. int screen_no;
  62. XSizeHints info; //informacje typu rozmiar i polozenie ok
  63.  
  64. char buffer[8]; //gdzie bedziemy zapamietywac znaki z klawiatury
  65. int hm_keys; //licznik klawiszy
  66. int to_end;
  67.  
  68. display = XOpenDisplay(""); //otworz polaczenie z X serverem pobierz dane od zmiennej srodowiskowej DISPLAY ("")
  69. screen_no = DefaultScreen(display); //pobierz domyslny ekran dla tego wyswietlacza (0)
  70. colormap = XDefaultColormap(display, screen_no);
  71. init_colors(display, screen_no, colormap);
  72.  
  73. //okresl rozmiar i polozenie okna
  74. info.x = 100;
  75. info.y = 150;
  76. info.width = 500;
  77. info.height = 300;
  78. info.flags = PPosition | PSize;
  79.  
  80. //majac wyswietlacz, stworz okno - domyslny uchwyt okna
  81. window = XCreateSimpleWindow(display, DefaultRootWindow(display),info.x, info.y, info.width, info.height, 7/* grubosc ramki */, foreground, background);
  82. XSetStandardProperties(display, window, title, icon_name, None, argv, argc, &info);
  83. //utworz kontekst graficzny do zarzadzania parametrami graficznymi (0,0) domyslne wartosci
  84. gc = XCreateGC(display, window, 0, 0);
  85. XSetBackground(display, gc, background);
  86. XSetForeground(display, gc, foreground);
  87.  
  88. //okresl zdarzenia jakie nas interesuja, np. nacisniecie klawisza
  89. XSelectInput(display, window, (KeyPressMask | ExposureMask | ButtonPressMask| ButtonReleaseMask | Button1MotionMask));
  90. XMapRaised(display, window); //wyswietl nasze okno na samym wierzchu wszystkich okien
  91.  
  92. to_end = FALSE;
  93.  
  94.  
  95. struct line lineTab[10000];
  96. int tabSize = 0;
  97. XPoint oldPos;
  98. XPoint currentPos;
  99.  
  100. /* petla najpierw sprawdza, czy warunek jest spelniony
  101. i jesli tak, to nastepuje przetwarzanie petli
  102. a jesli nie, to wyjscie z petli, bez jej przetwarzania */
  103. while (to_end == FALSE)
  104. {
  105. XNextEvent(display, &event); // czekaj na zdarzenia okreslone wczesniej przez funkcje XSelectInput
  106.  
  107. switch(event.type)
  108. {
  109. //pojawienie się okna, zmiana rozmiaru itp
  110. case Expose:
  111. if (event.xexpose.count == 0)
  112. {
  113. //wyrysowanie okręgu
  114. XDrawArc(display, window, gc, 100, 100, 100, 100, 0, 360*64);
  115. //wyrysowanie linii od nowa
  116. for(int i = 0; i < tabSize; i++)
  117. {
  118. XSetLineAttributes(display, gc, lineTab[i].width, 0, 0, 0);
  119. XDrawLine(display, window, gc, lineTab[i].oldPosition.x, lineTab[i].oldPosition.y, lineTab[i].currentPosition.x, lineTab[i].currentPosition.y);
  120. }
  121. }
  122. break;
  123.  
  124. case MappingNotify:
  125. XRefreshKeyboardMapping(&event.xmapping); // zmiana ukladu klawiatury - w celu zabezpieczenia sie przed taka zmiana trzeba to wykonac
  126. break;
  127. case ButtonPress:
  128. if (event.xbutton.button == Button1) // sprawdzenie czy wcisnieto lewy przycisk
  129. {
  130. //wczytanie pozycji klikniecia
  131. currentPos.x = event.xbutton.x;
  132. currentPos.y = event.xbutton.y;
  133.  
  134. }
  135. break;
  136.  
  137. //przy wciśnietym lewym przycisku ruch myszy
  138. case MotionNotify:
  139. {
  140. Bool currentInCircle = False;
  141. Bool lineMade = False;
  142. oldPos.x = currentPos.x;
  143. oldPos.y = currentPos.y;
  144. currentPos.x = event.xbutton.x;
  145. currentPos.y = event.xbutton.y;
  146.  
  147. //zapisanie linii do tablicy
  148. lineTab[tabSize].currentPosition = currentPos;
  149. lineTab[tabSize].oldPosition = oldPos;
  150.  
  151. //spr czy linia jest w kole -> wtedy ma być gruba
  152. if (sqrt((currentPos.x-150)*(currentPos.x-150)+(currentPos.y-150)*(currentPos.y-150))<=50)
  153. {
  154. XSetLineAttributes(display, gc, CRAZY_WIDTH, 0, 0, 0);
  155. lineTab[tabSize].width = CRAZY_WIDTH;
  156. currentInCircle = True;
  157. }
  158. else
  159. {
  160. XSetLineAttributes(display, gc, NORMAL_WIDTH, 0, 0, 0);
  161. lineTab[tabSize].width = NORMAL_WIDTH;
  162. }
  163.  
  164. /*if(currentInCircle == True && sqrt((oldPos.x-150)*(oldPos.x-150)+(oldPos.y-150)*(oldPos.y-150))>50)
  165. {
  166. //nowy jest w kole a stary nie
  167. int przeciecieX = (oldPos.x+currentPos.x)/2;
  168. int przeciecieY = (oldPos.y+currentPos.y)/2;
  169.  
  170.  
  171. lineTab[tabSize].width = NORMAL_WIDTH;
  172. lineTab[tabSize].currentPosition.x = przeciecieX;
  173. lineTab[tabSize].currentPosition.y = przeciecieY;
  174. lineTab[tabSize].oldPosition = oldPos;
  175. XSetLineAttributes(display, gc, NORMAL_WIDTH, 0, 0, 0);
  176. XDrawLine(display, window, gc, oldPos.x, oldPos.y, przeciecieX, przeciecieY);
  177. tabSize++;
  178.  
  179. lineTab[tabSize].width = CRAZY_WIDTH;
  180. lineTab[tabSize].currentPosition = currentPos;
  181. lineTab[tabSize].oldPosition.x = przeciecieX;
  182. lineTab[tabSize].oldPosition.y = przeciecieY;
  183. XSetLineAttributes(display, gc, CRAZY_WIDTH, 0, 0, 0);
  184. XDrawLine(display, window, gc, przeciecieX, przeciecieY, currentPos.x, currentPos.y);
  185. tabSize++;
  186. lineMade = True;
  187. break;
  188. }*/
  189.  
  190. if(currentInCircle == True && sqrt((oldPos.x-150)*(oldPos.x-150)+(oldPos.y-150)*(oldPos.y-150))>50)
  191. {
  192.  
  193. //współczynniki prostej
  194. double a = (currentPos.y - oldPos.y)/(currentPos.x - oldPos.x);
  195. double b = currentPos.y - a*currentPos.x;
  196.  
  197. double punktX = oldPos.x;
  198. double punktY = oldPos.y;
  199. while(punktX <= currentPos.x)
  200. {
  201. punktX+=0.01;
  202. punktY = a*(punktX)+b;
  203. //czy punkt jest na okregu lub blisko
  204. if(sqrt((punktX-150)*(punktX-150)+(punktY-150)*(punktY-150))>50-1 || sqrt((punktX-150)*(punktX-150)+(punktY-150)*(punktY-150))<=50+1)
  205. {
  206. XSetLineAttributes(display, gc, NORMAL_WIDTH, 0, 0, 0);
  207. XDrawLine(display, window, gc, oldPos.x, oldPos.y, punktX, punktY);
  208. XSetLineAttributes(display, gc, CRAZY_WIDTH, 0, 0, 0);
  209. XDrawLine(display, window, gc, punktX, punktY, currentPos.x, currentPos.y);
  210.  
  211. lineMade = True;
  212. break; //wyrysuj i wyjdz z petli
  213. }
  214. }
  215.  
  216.  
  217.  
  218.  
  219. }
  220.  
  221.  
  222. if(lineMade == False){
  223. XDrawLine(display, window, gc, oldPos.x, oldPos.y, currentPos.x, currentPos.y);
  224. tabSize++;
  225. }
  226.  
  227. break;
  228. }
  229. case KeyPress:
  230. hm_keys = XLookupString(&event.xkey, buffer, 8, &key, 0);
  231. if (hm_keys == 1)
  232. {
  233. if (buffer[0] == 'q') to_end = TRUE; // koniec programu
  234.  
  235. }
  236. break;
  237. default:
  238. break;
  239. }
  240. }
  241.  
  242. XFreeGC(display, gc);
  243. XDestroyWindow(display, window);
  244. XCloseDisplay(display);
  245.  
  246. return 0;
  247. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement