Add Circle Method.

This commit is contained in:
Ayham Abou Al Fadl 2019-09-26 23:30:46 +03:00
parent 6bf21a2532
commit 1821db6be4
18 changed files with 17311 additions and 3 deletions

View File

@ -23,12 +23,24 @@ if (CMAKE_BUILD_TYPE STREQUAL "Release")
add_definitions(-D__RELEASE__)
endif (CMAKE_BUILD_TYPE STREQUAL "Release")
# skidjular
project("upperlowerbounds")
# upperlowerBounds
project("upperlowerBounds")
file (GLOB_RECURSE uplowbounds_hdrs "src/*.h")
file (GLOB_RECURSE uplowbounds_hdrs "src/*.h src/*.hpp")
file (GLOB_RECURSE uplowbounds_srcs "src/*.cpp")
include_directories("src/")
add_executable(uplowbounds ${uplowbounds_hdrs} ${uplowbounds_srcs})
# Test Cases
# Circle Test.
add_executable(
circletest
src/vendor/catch.hpp
src/methods/circle/circle.h
../src/methods/circle/area.cpp
../src/methods/circle/perimeter.cpp
tests/CircleTest.cpp
)

View File

@ -37,3 +37,15 @@
Diameter: d=2r
Area: A=PIr^2
Circumference: C=2PIr=PId
## Upper and Lower bounds rules.
UB=UB+UB
UB=UB*UB
LB=LB+LB
LB=LB*LB
UB=UB/LB
UB=UB-LB
LB=LB/UB
LB=LB-UB

5
build.sh Executable file
View File

@ -0,0 +1,5 @@
mkdir build
cd build
cmake ..
make
cd ..

2
clean.sh Executable file
View File

@ -0,0 +1,2 @@
rm -rf build
rm -rf bin

9
src/defs.h Normal file
View File

@ -0,0 +1,9 @@
#ifndef DEFS_H
#define DEFS_H
struct uplowBounds {
float s_lower = 0.0;
float s_upper = 0.0;
};
#endif

View File

@ -0,0 +1,8 @@
#include <iostream>
#include "methods/circle/circle.h"
int main(void) {
std::cout << "Hello world.\n";
// std::cout << circle_calc_area(0.5f, 5.0f);
return 0;
}

View File

@ -0,0 +1,22 @@
#include "circle.h"
auto circle_calc_area(float max_error, float r, float a)->uplowBounds {
auto answer = uplowBounds();
if (a == 0.0f && r != 0.0f) {
answer.s_lower = M_PI*(pow((r-max_error),2.0f));
answer.s_upper = M_PI*(pow((r+max_error),2.0f));
return answer;
}
else if (r == 0.0f && a != 0.0f) { // calc radius if it is required.
answer.s_lower = sqrt((a-max_error)/M_PI);
answer.s_upper = sqrt((a+max_error)/M_PI);
return answer;
}
else if (a != 0.0f && r != 0.0f)
throw std::invalid_argument("Everything is given, you should probably reconsider your life decisions.");
else if (a == 0.0f && r == 0.0f)
throw std::invalid_argument("Nothing computes to nothing.");
return answer;
}

View File

@ -0,0 +1,12 @@
#ifndef CIRCLE_H
#define CIRCLE_H
#include <iostream>
#include <math.h>
#include "defs.h"
auto circle_calc_area(float max_error, float r=0.0f, float a=0.0f)->uplowBounds;
auto circle_calc_perimeter(float max_error, float r=0.0f, float d=0.0f, float p=0.0f)->uplowBounds;
#endif

View File

@ -0,0 +1,38 @@
#include "circle.h"
auto circle_calc_perimeter(float me, float r, float d, float p)->uplowBounds {
auto answer = uplowBounds();
if (p == 0.0f && (d != 0.0f || r != 0.0f)) {
if (r != 0.0f) { // Calc p from radius.
answer.s_lower = 2*M_PI*(r-me);
answer.s_upper = 2*M_PI*(r+me);
return answer;
}
else if (d != 0.0f) { // Calc p from diameter.
answer.s_lower = M_PI*(d-me);
answer.s_upper = M_PI*(d+me);
return answer;
}
else throw std::invalid_argument("Diameter or radius must be given when calculating circumference.");
return answer;
}
else if (p != 0.0f && (d == 0.0f || r == 0.0f)) {
if (d != 0.0f) { // Find radius.
answer.s_lower = (d-me)/2.0f;
answer.s_upper = (d+me)/2.0f;
return answer;
}
else if (r != 0.0f) { // Find diameter.
answer.s_lower = (r-me)*2;
answer.s_upper = (r+me)*2;
return answer;
}
else throw std::invalid_argument("Radius or Diameter must be present to compute one when Circumference is given.");
}
else if (p != 0.0f && d != 0.0f && r != 0.0f)
throw std::invalid_argument("Everything is given, Reconsider your life descisions.");
else if (p == 0.0f && d == 0.0f && r == 0.0f)
throw std::invalid_argument("Nothing computes to nothing.");
return answer;
}

View File

@ -0,0 +1 @@

View File

@ -0,0 +1,11 @@
#ifndef EQU_TRIANGLE_H
#define EQU_TRIANGLE_H
#include <iostream>
#include <math.h>
static auto etrian_calc_area(float max_error, float s=0.0f, float a=0.0f)->float;
static auto etrian_calc_height(float max_error, float s=0.0f, float h=0.0f)->float;
static auto etrain_calc_perimeter(float max_error, float s=0.0f, float p=0.0f)->float;
#endif

View File

@ -0,0 +1 @@

View File

@ -0,0 +1,10 @@
#ifndef PARALLELOGRAM_H
#define PARALLELOGRAM_H
#include <iostream>
#include <math.h>
static auto parall_calc_area(float max_error, float b=0.0f, float h=0.0f, float a=0.0f)->float;
static auto parall_calc_perimeter(float max_error, float b=0.0f, float h=0.0f, float p=0.0f)->float;
#endif

View File

@ -0,0 +1,10 @@
#ifndef RECTANGLE_H
#define RECTANGLE_H
#include <iostream>
#include <math.h>
static auto rect_calc_area(float max_error, float b=0.0f, float h=0.0f, float a=0.0f)->float;
static auto rect_calc_perimeter(float max_error, float b=0.0f, float h=0.0f, float p=0.0f)->float;
#endif

View File

@ -0,0 +1,10 @@
#ifndef SQUARE_H
#define SQUARE_H
#include <iostream>
#include <math.h>
static auto sqr_calc_area(float max_error, float s=0.0f, float a=0.0f)->float;
static auto sqr_calc_perimeter(float max_error, float s=0.0f, float p=0.0f)->float;
#endif

View File

@ -0,0 +1,10 @@
#ifndef TRAPEZOID_H
#define TRAPEZOID_H
#include <iostream>
#include<math.h>
static auto trape_calc_area(float max_error, float a=0.0f, float b=0.0f, float h=0.0f, float area=0.0f)->float;
static auto trape_calc_perimeter(float max_error, float a=0.0f, float b=0.0f, float h=0.0f, float p=0.0f)->float;
#endif

17075
src/vendor/catch.hpp vendored Normal file

File diff suppressed because it is too large Load Diff

60
tests/CircleTest.cpp Normal file
View File

@ -0,0 +1,60 @@
#define CATCH_CONFIG_MAIN
#include "vendor/catch.hpp"
#include "methods/circle/circle.h"
TEST_CASE("circle_calc_area: test if radius is given") {
REQUIRE(Approx(circle_calc_area(0.5f, 25.0f).s_lower) == (1885.74f));
REQUIRE(Approx(circle_calc_area(0.5f, 25.0f).s_upper) == (2042.82f));
REQUIRE(Approx(circle_calc_area(0.05f, 25.0f).s_lower) == (1955.65f));
REQUIRE(Approx(circle_calc_area(0.05f, 25.0f).s_upper) == (1971.36f));
}
TEST_CASE("circle_calc_area: test if area is given") {
REQUIRE(Approx(circle_calc_area(0.5f, 0.0f, 54.0f).s_lower).epsilon(.01) == (4.13f));
REQUIRE(Approx(circle_calc_area(0.5f, 0.0f, 54.0f).s_upper).epsilon(.01) == (4.17f));
REQUIRE(Approx(circle_calc_area(0.05f, 0.0f, 54.0f).s_lower).epsilon(.01) == (4.14f));
REQUIRE(Approx(circle_calc_area(0.05f, 0.0f, 54.0f).s_upper).epsilon(.01) == (4.15f));
}
TEST_CASE("circle_calc_perimeter: test if radius and diameter is given") {
REQUIRE(Approx(circle_calc_perimeter(0.5f, 5.0f, 10.0f).s_lower).epsilon(.01) == (28.27f));
REQUIRE(Approx(circle_calc_perimeter(0.5f, 5.0f, 10.0f).s_upper).epsilon(.01) == (34.56f));
REQUIRE(Approx(circle_calc_perimeter(0.05f, 5.0f, 10.0f).s_lower).epsilon(.1) == (31.1f));
REQUIRE(Approx(circle_calc_perimeter(0.05f, 5.0f, 10.0f).s_upper).epsilon(.01) == (31.73f));
}
TEST_CASE("circle_calc_perimeter: test if radius is given") {
REQUIRE(Approx(circle_calc_perimeter(0.5f, 5.0f).s_lower).epsilon(.01) == (28.27f));
REQUIRE(Approx(circle_calc_perimeter(0.5f, 5.0f).s_upper).epsilon(.01) == (34.56f));
REQUIRE(Approx(circle_calc_perimeter(0.05f, 5.0f).s_lower).epsilon(.1) == (31.1f));
REQUIRE(Approx(circle_calc_perimeter(0.05f, 5.0f).s_upper).epsilon(.01) == (31.73f));
}
TEST_CASE("circle_calc_perimeter: test if diameter is given") {
REQUIRE(Approx(circle_calc_perimeter(0.5f, 0.0f, 5.0f).s_lower).epsilon(.01) == (14.13f));
REQUIRE(Approx(circle_calc_perimeter(0.5f, 0.0f, 5.0f).s_upper).epsilon(.01) == (17.27f));
REQUIRE(Approx(circle_calc_perimeter(0.05f, 0.0f, 5.0f).s_lower).epsilon(.01) == (15.55f));
REQUIRE(Approx(circle_calc_perimeter(0.05f, 0.0f, 5.0f).s_upper).epsilon(.01) == (15.85f));
}
TEST_CASE("circle_calc_perimeter: test if perimeter and radius is given") {
REQUIRE(Approx(circle_calc_perimeter(0.5f, 5.0f, 0.0f, 10.0f).s_lower).epsilon(.01) == (9.00f));
REQUIRE(Approx(circle_calc_perimeter(0.5f, 5.0f, 0.0f, 10.0f).s_upper).epsilon(.01) == (11.00f));
REQUIRE(Approx(circle_calc_perimeter(0.05f, 5.0f, 0.0f, 10.0f).s_lower).epsilon(.1) == (9.9f));
REQUIRE(Approx(circle_calc_perimeter(0.05f, 5.0f, 0.0f, 10.0f).s_upper).epsilon(.1) == (10.1f));
}
TEST_CASE("circle_calc_perimeter: test if perimeter and diameter is given") {
REQUIRE(Approx(circle_calc_perimeter(0.5f, 0.0f, 5.0f, 10.0f).s_lower).epsilon(.01) == (2.25f));
REQUIRE(Approx(circle_calc_perimeter(0.5f, 0.0f, 5.0f, 10.0f).s_upper).epsilon(.01) == (2.75f));
REQUIRE(Approx(circle_calc_perimeter(0.05f, 0.0f, 5.0f, 10.0f).s_lower).epsilon(.01) == (2.475f));
REQUIRE(Approx(circle_calc_perimeter(0.05f, 0.0f, 5.0f, 10.0f).s_upper).epsilon(.01) == (2.525f));
}