#include <stdio.h> // for printf(), putchar()
#include <math.h> // for sqrt()
#define min(a, b) ((a) < (b) ? (a) : (b))
#define max(a, b) ((a) > (b) ? (a) : (b))
struct point
{
int x;
int y;
};
struct point makepoint(int x, int y); // return point
struct point middlep(struct point pt1, struct point pt2); // middle point
struct point addpoints(struct point pt1, struct point pt2); // pt1 + pt2
void prnstrp(char *name, struct point pt); // print structure point
double distp(struct point pt); // distance of point from origin
struct rect // rectangle
{ // we assume pt1 < pt2
struct point pt1; // left down corner
struct point pt2; // right up corner
};
struct point center(struct rect);
void prnrect(char *name, struct rect); // print rectangle
int ptinrect(struct point pt, struct rect r); // point inside rectangle
struct rect canonrect(struct rect r); // canonical rectangle
int main()
{
struct point pt;
struct point origin = makepoint(0, 0);
struct point maxpt = {320, 200};
prnstrp("origin", origin);
prnstrp("maxpt", maxpt);
printf("dist: %f\n", distp(maxpt));
struct point m = middlep(origin, maxpt);
prnstrp("middle", m);
printf("dist: %f\n", distp(m));
struct rect screen;
screen.pt1 = origin;
screen.pt2 = maxpt;
struct point c = center(screen);
prnstrp("center", c);
printf("dist: %f\n", distp(c));
putchar('\n');
struct point sum = addpoints(m, c);
prnstrp("origin", origin);
prnstrp("middle", m);
prnstrp("center", c);
prnstrp("sum", sum);
prnstrp("maxpt", maxpt);
putchar('\n');
prnrect("screen", screen);
printf("origin in screen: %d\n", ptinrect(origin, screen));
printf("center in screen: %d\n", ptinrect(c, screen));
printf("maxpt in screen: %d\n", ptinrect(maxpt, screen));
putchar('\n');
struct point inverted = makepoint(c.y, c.x);
struct rect noncanon = {c, inverted};
struct rect canon = canonrect(noncanon);
prnrect("noncanon", noncanon);
prnrect("canon", canon);
putchar('\n');
struct point *pp; // pointer to struct point
pp = &origin;
prnstrp("*pp", *pp);
printf("(*pp).x: %d, pp->y: %d\n", (*pp).x, pp->y);
putchar('\n');
struct rect *rp = &screen;
printf("rp->pt1.x: %d\n", rp->pt1.x);
printf("++rp->pt1.x: %d\n", ++rp->pt1.x); // ++(rp->pt1.x)
printf("rp->pt1.x: %d\n", rp->pt1.x);
putchar('\n');
struct // no name
{
int len;
char *str;
} s = {0, "hello"}, *p = &s;
printf("p->len: %d\n", p->len);
printf("++p->len: %d\n", ++p->len); // ++(p->len)
printf("p->str: %s\n", p->str);
printf("*p->str++: %c\n", *p->str++);
printf("*p->str: %c\n", *p->str);
printf("--p->str: %s\n", --p->str);
printf("p->str: %s\n", p->str);
/*
p++;
printf("p->len: %d\n", p->len); // garbage value
printf("p->str: %s\n", p->str); // run-time error (segmentation fault)
*/
return 0;
}
struct point makepoint(int x, int y) // return point
{
struct point temp;
temp.x = x;
temp.y = y;
return temp;
}
struct point middlep(struct point pt1, struct point pt2) // middle point
{
makepoint((pt1.x + pt2.x) / 2, (pt1.y + pt2.y) / 2);
}
struct point addpoints(struct point pt1, struct point pt2) // pt1 + pt2
{
pt1.x += pt2.x;
pt1.y += pt2.y;
return pt1;
}
void prnstrp(char *name, struct point pt) // print structure point
{
printf("%s: (%d, %d)\n", name, pt.x, pt.y);
}
double distp(struct point pt) // distance of point from origin
{
return sqrt((double)pt.x * pt.x + (double)pt.y * pt.y);
}
struct point center(struct rect r)
{
return middlep (r.pt1, r.pt2);
}
void prnrect(char *name, struct rect r) // print rectangle
{
printf("%s: ((%d, %d), (%d, %d))\n", name, r.pt1.x, r.pt1.y, r.pt2.x, r.pt2.y);
}
int ptinrect(struct point pt, struct rect r) // point inside rectangle
{ // return 1 if pt in r, 0 if not
return pt.x >= r.pt1.x && pt.x < r.pt2.x &&
pt.y >= r.pt1.y && pt.y < r.pt2.y;
}
// turn r into a canonical rectangle: pt1 <= pt2
struct rect canonrect(struct rect r) // canonical rectangle
{
struct rect temp;
temp.pt1.x = min(r.pt1.x, r.pt2.x);
temp.pt1.y = min(r.pt1.y, r.pt2.y);
temp.pt2.x = max(r.pt1.x, r.pt2.x);
temp.pt2.y = max(r.pt1.y, r.pt2.y);
return temp;
}
/*
gcc points.c -o points -lm // link math library
./points
origin: (0, 0)
maxpt: (320, 200)
dist: 377.359245
middle: (160, 100)
dist: 188.679623
center: (160, 100)
dist: 188.679623
origin: (0, 0)
middle: (160, 100)
center: (160, 100)
sum: (320, 200)
maxpt: (320, 200)
screen: ((0, 0), (320, 200))
origin in screen: 1 // rectangle includes left and bottom sides
center in screen: 1
maxpt in screen: 0 // rectangle does not include right and top sides
noncanon: ((160, 100), (100, 160))
canon: ((100, 100), (160, 160))
*pp: (0, 0)
(*pp).x: 0, pp->y: 0
rp->pt1.x: 0
++rp->pt1.x: 1
rp->pt1.x: 1
p->len: 0
++p->len: 1
p->str: hello
*p->str++: h
*p->str: e
p->str--: hello
p->str: hello
*/