circle, ellipse extremes [fltk]

Bjarne Stroustrup “Programming Principles and Practice Using C++”
Chapter 13 Exercise 5
Using GUI library called FLTK (Fast Light Tool Kit, “full tick”).

Output:

//  Philipp Siedler
//  Bjarne Stroustrup's PP
//  Chapter 13 Exercise 5

#define _USE_MATH_DEFINES
#include "Simple_window.h"
#include "Graph.h"
#include <cmath>
using namespace Graph_lib;

ostream& operator<<(ostream& out, Point& a) {
	out << "(" << a.x << "," << a.y << ")";
	return out;
}

Point& operator+=(Point& a, Point& b) {
	a = Point(a.x + b.x, a.y + b.y);
	return a;
}

// CIRCLE -------------------------------

Point centerCircle(Graph_lib::Circle& cir) {
	return Point(cir.point(0).x + cir.radius(), cir.point(0).y + cir.radius());
}

Point nC(Graph_lib::Circle& cir) {
	Point temp = centerCircle(cir);
	return Point(temp.x, temp.y - cir.radius());
}

Point neC(Graph_lib::Circle& cir) {
	Point temp = centerCircle(cir);
	return Point(temp.x + cir.radius() * cos(M_PI / 4), temp.y - cir.radius() * sin(M_PI / 4));
}

Point eC(Graph_lib::Circle& cir) {
	Point temp = centerCircle(cir);
	return Point(temp.x + cir.radius(), temp.y);
}

Point seC(Graph_lib::Circle& cir) {
	Point temp = centerCircle(cir);
	return Point(temp.x + cir.radius() * cos(M_PI / 4), temp.y + cir.radius() * sin(M_PI / 4));
}

Point sC(Graph_lib::Circle& cir) {
	Point temp = centerCircle(cir);
	return Point(temp.x, temp.y + cir.radius());
}

Point swC(Graph_lib::Circle& cir) {
	Point temp = centerCircle(cir);
	return Point(temp.x - cir.radius() * cos(M_PI / 4), temp.y + cir.radius() * sin(M_PI / 4));
}

Point wC(Graph_lib::Circle& cir) {
	Point temp = centerCircle(cir);
	return Point(temp.x - cir.radius(), temp.y);
}

Point nwC(Graph_lib::Circle& cir) {
	Point temp = centerCircle(cir);
	return Point(temp.x - cir.radius() * cos(M_PI / 4), temp.y - cir.radius() * sin(M_PI / 4));
}

// ELLIPSE -------------------------------

Point nE(Graph_lib::Ellipse& eli) {
	int a = eli.major(); //width
	int b = eli.minor(); //height

	cout << a << endl;
	cout << b << endl;
	
	int x = eli.center().x;
	int y = eli.center().y - b;

	return Point(x,y);
}

Point neE(Graph_lib::Ellipse& eli) {
	int a = eli.major(); //width
	int b = eli.minor(); //height

	cout << a << endl;
	cout << b << endl;

	int x = eli.center().x + a * cos(M_PI / 4);
	int y = eli.center().y - b * sin(M_PI / 4);

	return Point(x, y);
}

Point eE(Graph_lib::Ellipse& eli) {
	int a = eli.major(); //width
	int b = eli.minor(); //height

	cout << a << endl;
	cout << b << endl;

	int x = eli.center().x + a;
	int y = eli.center().y;

	return Point(x, y);
}

Point seE(Graph_lib::Ellipse& eli) {
	int a = eli.major(); //width
	int b = eli.minor(); //height

	cout << a << endl;
	cout << b << endl;

	int x = eli.center().x + a * cos(M_PI / 4);
	int y = eli.center().y + b * sin(M_PI / 4);

	return Point(x, y);
}

Point sE(Graph_lib::Ellipse& eli) {
	int a = eli.major(); //width
	int b = eli.minor(); //height

	cout << a << endl;
	cout << b << endl;

	int x = eli.center().x;
	int y = eli.center().y + b;

	return Point(x, y);
}

Point swE(Graph_lib::Ellipse& eli) {
	int a = eli.major(); //width
	int b = eli.minor(); //height

	cout << a << endl;
	cout << b << endl;

	int x = eli.center().x - a * cos(M_PI / 4);
	int y = eli.center().y + b * sin(M_PI / 4);

	return Point(x, y);
}

Point wE(Graph_lib::Ellipse& eli) {
	int a = eli.major(); //width
	int b = eli.minor(); //height

	cout << a << endl;
	cout << b << endl;

	int x = eli.center().x - a;
	int y = eli.center().y;

	return Point(x, y);
}

Point nwE(Graph_lib::Ellipse& eli) {
	int a = eli.major(); //width
	int b = eli.minor(); //height

	cout << a << endl;
	cout << b << endl;

	int x = eli.center().x - a * cos(M_PI / 4);
	int y = eli.center().y - b * sin(M_PI / 4);

	return Point(x, y);
}

int main()
try
{
	Point tl(100, 100);
	Simple_window win(tl, 600, 400, "Simple Window");

	//CIRCLE
	Graph_lib::Circle testCircle(Point(200, 200), 50);
	testCircle.set_color(Color::red);

	Point ptCircle = neC(testCircle);

	Mark markCircle(ptCircle, '+');
	markCircle.set_color(Color::blue);
	cout << ptCircle << endl;

	win.attach(testCircle);
	win.attach(markCircle);

	//ELLIPSE
	Graph_lib::Ellipse testEllipse(Point(400, 200), 100, 50);
	testEllipse.set_color(Color::red);

	Point ptEllipse = neE(testEllipse);

	Mark markEllipse(ptEllipse, '+');
	markEllipse.set_color(Color::blue);

	cout << ptEllipse << endl;

	win.attach(testEllipse);
	win.attach(markEllipse);

	win.wait_for_button();
}
catch (exception& e) {
	cout << e.what() << endl;
	return 1;
}
catch (...) {
	cout << "Exiting" << endl;
	return 2;
}

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

w

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.