Moved get_fragments_from_r into Calc

export-menu
Torsten Paul 2013-12-27 17:48:15 -05:00 committed by Marius Kintel
parent 68de0ab680
commit b49f51dab3
8 changed files with 64 additions and 22 deletions

View File

@ -206,6 +206,7 @@ HEADERS += src/typedefs.h \
src/OpenCSGWarningDialog.h \
src/AboutDialog.h \
src/builtin.h \
src/calc.h \
src/context.h \
src/modcontext.h \
src/evalcontext.h \
@ -324,6 +325,7 @@ SOURCES += src/version_check.cc \
src/AutoUpdater.cc \
\
src/builtin.cc \
src/calc.cc \
src/export.cc \
src/export_png.cc \
src/import.cc \

View File

@ -13,10 +13,10 @@
#include "dxfdata.h"
#include "dxftess.h"
#include "module.h"
#include "calc.h"
#include "svg.h"
#include "printutils.h"
#include "openscad.h" // get_fragments_from_r()
#include <boost/foreach.hpp>
#include <vector>
@ -469,7 +469,7 @@ PolySet *PolySetCGALEvaluator::rotateDxfData(const RotateExtrudeNode &node, DxfD
}
}
int fragments = get_fragments_from_r(max_x-min_x, node.fn, node.fs, node.fa);
int fragments = Calc::get_fragments_from_r(max_x-min_x, node.fn, node.fs, node.fa);
double ***points;
points = new double**[fragments];

40
src/calc.cc Normal file
View File

@ -0,0 +1,40 @@
/*
* OpenSCAD (www.openscad.org)
* Copyright (C) 2009-2011 Clifford Wolf <clifford@clifford.at> and
* Marius Kintel <marius@kintel.net>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* As a special exception, you have permission to link this program
* with the CGAL library and distribute executables, as long as you
* follow the requirements of the GNU GPL in regard to all of the
* software in the executable aside from CGAL.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#include "calc.h"
#include "grid.h"
/*!
Returns the number of subdivision of a whole circle, given radius and
the three special variables $fn, $fs and $fa
*/
int Calc::get_fragments_from_r(double r, double fn, double fs, double fa)
{
if (r < GRID_FINE) return 3;
if (fn > 0.0) return (int)(fn >= 3 ? fn : 3);
return (int)ceil(fmax(fmin(360.0 / fa, r*2*M_PI / fs), 5));
}

9
src/calc.h Normal file
View File

@ -0,0 +1,9 @@
#ifndef CALC_H_
#define CALC_H_
class Calc {
public:
static int get_fragments_from_r(double r, double fn, double fs, double fa);
};
#endif

View File

@ -28,7 +28,7 @@
#include "grid.h"
#include "printutils.h"
#include "handle_dep.h"
#include "openscad.h" // get_fragments_from_r()
#include "calc.h"
#include <fstream>
#include "mathc99.h"
@ -189,7 +189,7 @@ DxfData::DxfData(double fn, double fs, double fa,
}
}
else if (mode == "CIRCLE") {
int n = get_fragments_from_r(radius, fn, fs, fa);
int n = Calc::get_fragments_from_r(radius, fn, fs, fa);
Vector2d center(xverts[0], yverts[0]);
for (int i = 0; i < n; i++) {
double a1 = (2*M_PI*i)/n;
@ -200,7 +200,7 @@ DxfData::DxfData(double fn, double fs, double fa,
}
else if (mode == "ARC") {
Vector2d center(xverts[0], yverts[0]);
int n = get_fragments_from_r(radius, fn, fs, fa);
int n = Calc::get_fragments_from_r(radius, fn, fs, fa);
while (arc_start_angle > arc_stop_angle)
arc_stop_angle += 360.0;
n = (int)ceil(n * (arc_stop_angle-arc_start_angle) / 360);
@ -237,7 +237,7 @@ DxfData::DxfData(double fn, double fs, double fa,
// the ratio stored in 'radius; due to the parser code not checking entity type
double r_minor = r_major * radius;
double sweep_angle = ellipse_stop_angle-ellipse_start_angle;
int n = get_fragments_from_r(r_major, fn, fs, fa);
int n = Calc::get_fragments_from_r(r_major, fn, fs, fa);
n = (int)ceil(n * sweep_angle / (2 * M_PI));
// Vector2d p1;
Vector2d p1; p1 << 0,0;

View File

@ -32,7 +32,7 @@
#include "fileutils.h"
#include "builtin.h"
#include "PolySetEvaluator.h"
#include "openscad.h" // get_fragments_from_r()
#include "calc.h"
#include "mathc99.h"
#include <sstream>
@ -113,7 +113,7 @@ AbstractNode *LinearExtrudeModule::instantiate(const Context *ctx, const ModuleI
if (slices.type() == Value::NUMBER) {
node->slices = (int)slices.toDouble();
} else {
node->slices = (int)fmax(2, fabs(get_fragments_from_r(node->height,
node->slices = (int)fmax(2, fabs(Calc::get_fragments_from_r(node->height,
node->fn, node->fs, node->fa) * node->twist / 360));
}
node->has_twist = true;

View File

@ -34,6 +34,7 @@
#include "printutils.h"
#include "visitor.h"
#include "context.h"
#include "calc.h"
#include <sstream>
#include <assert.h>
#include <boost/assign/std/vector.hpp>
@ -275,17 +276,6 @@ AbstractNode *PrimitiveModule::instantiate(const Context *ctx, const ModuleInsta
return node;
}
/*!
Returns the number of subdivision of a whole circle, given radius and
the three special variables $fn, $fs and $fa
*/
int get_fragments_from_r(double r, double fn, double fs, double fa)
{
if (r < GRID_FINE) return 3;
if (fn > 0.0) return (int)(fn >= 3 ? fn : 3);
return (int)ceil(fmax(fmin(360.0 / fa, r*2*M_PI / fs), 5));
}
struct point2d {
double x, y;
};
@ -364,7 +354,7 @@ PolySet *PrimitiveNode::evaluate_polyset(class PolySetEvaluator *) const
double z;
};
int fragments = get_fragments_from_r(r1, fn, fs, fa);
int fragments = Calc::get_fragments_from_r(r1, fn, fs, fa);
int rings = (fragments+1)/2;
// Uncomment the following three lines to enable experimental sphere tesselation
// if (rings % 2 == 0) rings++; // To ensure that the middle ring is at phi == 0 degrees
@ -427,7 +417,7 @@ sphere_next_r2:
if (this->type == CYLINDER &&
this->h > 0 && this->r1 >=0 && this->r2 >= 0 && (this->r1 > 0 || this->r2 > 0))
{
int fragments = get_fragments_from_r(fmax(this->r1, this->r2), this->fn, this->fs, this->fa);
int fragments = Calc::get_fragments_from_r(fmax(this->r1, this->r2), this->fn, this->fs, this->fa);
double z1, z2;
if (this->center) {
@ -525,7 +515,7 @@ sphere_next_r2:
if (this->type == CIRCLE)
{
int fragments = get_fragments_from_r(this->r1, this->fn, this->fs, this->fa);
int fragments = Calc::get_fragments_from_r(this->r1, this->fn, this->fs, this->fa);
p->is2d = true;
p->append_poly();

View File

@ -507,6 +507,7 @@ set(CORE_SOURCES
../src/linalg.cc
../src/handle_dep.cc
../src/value.cc
../src/calc.cc
../src/expr.cc
../src/func.cc
../src/localscope.cc