Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <X11/Xlib.h>
- #include <X11/Xutil.h>
- #include <stdlib.h>
- #include <string.h>
- #include <math.h>
- #define TRUE 1
- #define FALSE 0
- #define NORMAL_WIDTH 1
- #define CRAZY_WIDTH 4
- int red, green, blue, yellow;
- unsigned long foreground, background;
- struct line
- {
- unsigned int width;
- XPoint currentPosition;
- XPoint oldPosition;
- };
- //*************************************************************************************************************************
- //funkcja przydzielania kolorow
- int AllocNamedColor(char *name, Display* display, Colormap colormap)
- {
- XColor col;
- XParseColor(display, colormap, name, &col);
- XAllocColor(display, colormap, &col);
- return col.pixel;
- }
- //*************************************************************************************************************************
- // inicjalizacja zmiennych globalnych okreslajacych kolory
- int init_colors(Display* display, int screen_no, Colormap colormap)
- {
- background = WhitePixel(display, screen_no); //niech tlo bedzie biale
- foreground = BlackPixel(display, screen_no); //niech ekran bedzie czarny
- red=AllocNamedColor("red", display, colormap);
- green=AllocNamedColor("green", display, colormap);
- blue=AllocNamedColor("blue", display, colormap);
- yellow=AllocNamedColor("yellow", display, colormap);
- }
- //*************************************************************************************************************************
- // Glowna funkcja zawierajaca petle obslugujaca zdarzenia */
- int main(int argc, char *argv[])
- {
- char icon_name[] = "Grafika";
- char title[] = "Grafika komputerowa";
- Display* display; //gdzie bedziemy wysylac dane (do jakiego X servera)
- Window window; //nasze okno, gdzie bedziemy dokonywac roznych operacji
- GC gc; //tu znajduja sie informacje o parametrach graficznych
- XEvent event; //gdzie bedziemy zapisywac pojawiajace sie zdarzenia
- KeySym key; //informacja o stanie klawiatury
- Colormap colormap;
- int screen_no;
- XSizeHints info; //informacje typu rozmiar i polozenie ok
- char buffer[8]; //gdzie bedziemy zapamietywac znaki z klawiatury
- int hm_keys; //licznik klawiszy
- int to_end;
- display = XOpenDisplay(""); //otworz polaczenie z X serverem pobierz dane od zmiennej srodowiskowej DISPLAY ("")
- screen_no = DefaultScreen(display); //pobierz domyslny ekran dla tego wyswietlacza (0)
- colormap = XDefaultColormap(display, screen_no);
- init_colors(display, screen_no, colormap);
- //okresl rozmiar i polozenie okna
- info.x = 100;
- info.y = 150;
- info.width = 500;
- info.height = 300;
- info.flags = PPosition | PSize;
- //majac wyswietlacz, stworz okno - domyslny uchwyt okna
- window = XCreateSimpleWindow(display, DefaultRootWindow(display),info.x, info.y, info.width, info.height, 7/* grubosc ramki */, foreground, background);
- XSetStandardProperties(display, window, title, icon_name, None, argv, argc, &info);
- //utworz kontekst graficzny do zarzadzania parametrami graficznymi (0,0) domyslne wartosci
- gc = XCreateGC(display, window, 0, 0);
- XSetBackground(display, gc, background);
- XSetForeground(display, gc, foreground);
- //okresl zdarzenia jakie nas interesuja, np. nacisniecie klawisza
- XSelectInput(display, window, (KeyPressMask | ExposureMask | ButtonPressMask| ButtonReleaseMask | Button1MotionMask));
- XMapRaised(display, window); //wyswietl nasze okno na samym wierzchu wszystkich okien
- to_end = FALSE;
- struct line lineTab[10000];
- int tabSize = 0;
- XPoint oldPos;
- XPoint currentPos;
- /* petla najpierw sprawdza, czy warunek jest spelniony
- i jesli tak, to nastepuje przetwarzanie petli
- a jesli nie, to wyjscie z petli, bez jej przetwarzania */
- while (to_end == FALSE)
- {
- XNextEvent(display, &event); // czekaj na zdarzenia okreslone wczesniej przez funkcje XSelectInput
- switch(event.type)
- {
- //pojawienie się okna, zmiana rozmiaru itp
- case Expose:
- if (event.xexpose.count == 0)
- {
- //wyrysowanie okręgu
- XDrawArc(display, window, gc, 100, 100, 100, 100, 0, 360*64);
- //wyrysowanie linii od nowa
- for(int i = 0; i < tabSize; i++)
- {
- XSetLineAttributes(display, gc, lineTab[i].width, 0, 0, 0);
- XDrawLine(display, window, gc, lineTab[i].oldPosition.x, lineTab[i].oldPosition.y, lineTab[i].currentPosition.x, lineTab[i].currentPosition.y);
- }
- }
- break;
- case MappingNotify:
- XRefreshKeyboardMapping(&event.xmapping); // zmiana ukladu klawiatury - w celu zabezpieczenia sie przed taka zmiana trzeba to wykonac
- break;
- case ButtonPress:
- if (event.xbutton.button == Button1) // sprawdzenie czy wcisnieto lewy przycisk
- {
- //wczytanie pozycji klikniecia
- currentPos.x = event.xbutton.x;
- currentPos.y = event.xbutton.y;
- }
- break;
- //przy wciśnietym lewym przycisku ruch myszy
- case MotionNotify:
- {
- Bool currentInCircle = False;
- Bool lineMade = False;
- oldPos.x = currentPos.x;
- oldPos.y = currentPos.y;
- currentPos.x = event.xbutton.x;
- currentPos.y = event.xbutton.y;
- //zapisanie linii do tablicy
- lineTab[tabSize].currentPosition = currentPos;
- lineTab[tabSize].oldPosition = oldPos;
- //spr czy linia jest w kole -> wtedy ma być gruba
- if (sqrt((currentPos.x-150)*(currentPos.x-150)+(currentPos.y-150)*(currentPos.y-150))<=50)
- {
- XSetLineAttributes(display, gc, CRAZY_WIDTH, 0, 0, 0);
- lineTab[tabSize].width = CRAZY_WIDTH;
- currentInCircle = True;
- }
- else
- {
- XSetLineAttributes(display, gc, NORMAL_WIDTH, 0, 0, 0);
- lineTab[tabSize].width = NORMAL_WIDTH;
- }
- /*if(currentInCircle == True && sqrt((oldPos.x-150)*(oldPos.x-150)+(oldPos.y-150)*(oldPos.y-150))>50)
- {
- //nowy jest w kole a stary nie
- int przeciecieX = (oldPos.x+currentPos.x)/2;
- int przeciecieY = (oldPos.y+currentPos.y)/2;
- lineTab[tabSize].width = NORMAL_WIDTH;
- lineTab[tabSize].currentPosition.x = przeciecieX;
- lineTab[tabSize].currentPosition.y = przeciecieY;
- lineTab[tabSize].oldPosition = oldPos;
- XSetLineAttributes(display, gc, NORMAL_WIDTH, 0, 0, 0);
- XDrawLine(display, window, gc, oldPos.x, oldPos.y, przeciecieX, przeciecieY);
- tabSize++;
- lineTab[tabSize].width = CRAZY_WIDTH;
- lineTab[tabSize].currentPosition = currentPos;
- lineTab[tabSize].oldPosition.x = przeciecieX;
- lineTab[tabSize].oldPosition.y = przeciecieY;
- XSetLineAttributes(display, gc, CRAZY_WIDTH, 0, 0, 0);
- XDrawLine(display, window, gc, przeciecieX, przeciecieY, currentPos.x, currentPos.y);
- tabSize++;
- lineMade = True;
- break;
- }*/
- if(currentInCircle == True && sqrt((oldPos.x-150)*(oldPos.x-150)+(oldPos.y-150)*(oldPos.y-150))>50)
- {
- //współczynniki prostej
- double a = (currentPos.y - oldPos.y)/(currentPos.x - oldPos.x);
- double b = currentPos.y - a*currentPos.x;
- double punktX = oldPos.x;
- double punktY = oldPos.y;
- while(punktX <= currentPos.x)
- {
- punktX+=0.01;
- punktY = a*(punktX)+b;
- //czy punkt jest na okregu lub blisko
- if(sqrt((punktX-150)*(punktX-150)+(punktY-150)*(punktY-150))>50-1 || sqrt((punktX-150)*(punktX-150)+(punktY-150)*(punktY-150))<=50+1)
- {
- XSetLineAttributes(display, gc, NORMAL_WIDTH, 0, 0, 0);
- XDrawLine(display, window, gc, oldPos.x, oldPos.y, punktX, punktY);
- XSetLineAttributes(display, gc, CRAZY_WIDTH, 0, 0, 0);
- XDrawLine(display, window, gc, punktX, punktY, currentPos.x, currentPos.y);
- lineMade = True;
- break; //wyrysuj i wyjdz z petli
- }
- }
- }
- if(lineMade == False){
- XDrawLine(display, window, gc, oldPos.x, oldPos.y, currentPos.x, currentPos.y);
- tabSize++;
- }
- break;
- }
- case KeyPress:
- hm_keys = XLookupString(&event.xkey, buffer, 8, &key, 0);
- if (hm_keys == 1)
- {
- if (buffer[0] == 'q') to_end = TRUE; // koniec programu
- }
- break;
- default:
- break;
- }
- }
- XFreeGC(display, gc);
- XDestroyWindow(display, window);
- XCloseDisplay(display);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement