refactored circle
This commit is contained in:
parent
dac27c9913
commit
c0cc551228
@ -349,23 +349,38 @@ viz::WCircle
|
|||||||
|
|
||||||
This 3D Widget defines a circle. ::
|
This 3D Widget defines a circle. ::
|
||||||
|
|
||||||
class CV_EXPORTS WCircle : public Widget3D
|
class CV_EXPORTS WCircle : public Widget3D
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
WCircle(const Point3f& pt, double radius, double thickness = 0.01, const Color &color = Color::white());
|
//! creates default planar circle centred at origin with plane normal along z-axis
|
||||||
|
WCircle(double radius, double thickness = 0.01, const Color &color = Color::white());
|
||||||
|
|
||||||
|
//! creates repositioned circle
|
||||||
|
WCircle(double radius, const Point3d& center, const Vec3d& normal, double thickness = 0.01, const Color &color = Color::white());
|
||||||
};
|
};
|
||||||
|
|
||||||
viz::WCircle::WCircle
|
viz::WCircle::WCircle
|
||||||
-------------------------------
|
-------------------------------
|
||||||
Constructs a WCircle.
|
Constructs default planar circle centred at origin with plane normal along z-axis
|
||||||
|
|
||||||
.. ocv:function:: WCircle(const Point3f& pt, double radius, double thickness = 0.01, const Color &color = Color::white())
|
.. ocv:function:: WCircle(double radius, double thickness = 0.01, const Color &color = Color::white());
|
||||||
|
|
||||||
:param pt: Center of the circle.
|
:param radius: Radius of the circle.
|
||||||
:param radius: Radius of the circle.
|
|
||||||
:param thickness: Thickness of the circle.
|
:param thickness: Thickness of the circle.
|
||||||
:param color: :ocv:class:`Color` of the circle.
|
:param color: :ocv:class:`Color` of the circle.
|
||||||
|
|
||||||
|
viz::WCircle::WCircle
|
||||||
|
-------------------------------
|
||||||
|
Constructs repositioned planar circle.
|
||||||
|
|
||||||
|
.. ocv:function:: WCircle(double radius, const Point3d& center, const Vec3d& normal, double thickness = 0.01, const Color &color = Color::white());
|
||||||
|
|
||||||
|
:param radius: Radius of the circle.
|
||||||
|
:param center: Center of the circle.
|
||||||
|
:param normal: Normal of the plane in which the circle lies.
|
||||||
|
:param thickness: Thickness of the circle.
|
||||||
|
:param color: :ocv:class:`Color` of the circle.
|
||||||
|
|
||||||
viz::WCylinder
|
viz::WCylinder
|
||||||
--------------
|
--------------
|
||||||
.. ocv:class:: WCylinder
|
.. ocv:class:: WCylinder
|
||||||
|
@ -164,7 +164,11 @@ namespace cv
|
|||||||
class CV_EXPORTS WCircle : public Widget3D
|
class CV_EXPORTS WCircle : public Widget3D
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
WCircle(const Point3d& pt, double radius, double thickness = 0.01, const Color &color = Color::white());
|
//! creates default circle centred at origin with normal along z-axis
|
||||||
|
WCircle(double radius, double thickness = 0.01, const Color &color = Color::white());
|
||||||
|
|
||||||
|
//! creates repositioned circle
|
||||||
|
WCircle(double radius, const Point3d& center, const Vec3d& normal, double thickness = 0.01, const Color &color = Color::white());
|
||||||
};
|
};
|
||||||
|
|
||||||
class CV_EXPORTS WCylinder : public Widget3D
|
class CV_EXPORTS WCylinder : public Widget3D
|
||||||
|
@ -209,6 +209,12 @@ namespace cv
|
|||||||
return scaled_color;
|
return scaled_color;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline Vec3d get_random_vec(double from = -10.0, double to = 10.0)
|
||||||
|
{
|
||||||
|
RNG& rng = theRNG();
|
||||||
|
return Vec3d(rng.uniform(from, to), rng.uniform(from, to), rng.uniform(from, to));
|
||||||
|
}
|
||||||
|
|
||||||
struct VtkUtils
|
struct VtkUtils
|
||||||
{
|
{
|
||||||
template<class Filter>
|
template<class Filter>
|
||||||
|
@ -182,18 +182,17 @@ cv::viz::WArrow::WArrow(const Point3d& pt1, const Point3d& pt2, double thickness
|
|||||||
arrow_source->SetTipRadius(thickness * 3.0);
|
arrow_source->SetTipRadius(thickness * 3.0);
|
||||||
arrow_source->SetTipLength(thickness * 10.0);
|
arrow_source->SetTipLength(thickness * 10.0);
|
||||||
|
|
||||||
RNG rng = theRNG();
|
Vec3d arbitrary = get_random_vec();
|
||||||
Vec3d arbitrary(rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0));
|
Vec3d start_point(pt1.x, pt1.y, pt1.z), end_point(pt2.x, pt2.y, pt2.z);
|
||||||
Vec3d startPoint(pt1.x, pt1.y, pt1.z), endPoint(pt2.x, pt2.y, pt2.z);
|
|
||||||
|
|
||||||
double length = norm(endPoint - startPoint);
|
double length = norm(end_point - start_point);
|
||||||
|
|
||||||
Vec3d xvec = normalized(endPoint - startPoint);
|
Vec3d xvec = normalized(end_point - start_point);
|
||||||
Vec3d zvec = normalized(xvec.cross(arbitrary));
|
Vec3d zvec = normalized(xvec.cross(arbitrary));
|
||||||
Vec3d yvec = zvec.cross(xvec);
|
Vec3d yvec = zvec.cross(xvec);
|
||||||
|
|
||||||
Matx33d R = makeTransformToGlobal(xvec, yvec, zvec).rotation();
|
Matx33d R = makeTransformToGlobal(xvec, yvec, zvec).rotation();
|
||||||
Affine3d transform_with_scale(R * length, startPoint);
|
Affine3d transform_with_scale(R * length, start_point);
|
||||||
|
|
||||||
vtkSmartPointer<vtkPolyData> polydata = VtkUtils::TransformPolydata(arrow_source->GetOutputPort(), transform_with_scale);
|
vtkSmartPointer<vtkPolyData> polydata = VtkUtils::TransformPolydata(arrow_source->GetOutputPort(), transform_with_scale);
|
||||||
|
|
||||||
@ -216,32 +215,36 @@ template<> cv::viz::WArrow cv::viz::Widget::cast<cv::viz::WArrow>()
|
|||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
/// circle widget implementation
|
/// circle widget implementation
|
||||||
|
|
||||||
cv::viz::WCircle::WCircle(const Point3d& pt, double radius, double thickness, const Color& color)
|
cv::viz::WCircle::WCircle(double radius, double thickness, const Color &color)
|
||||||
{
|
{
|
||||||
vtkSmartPointer<vtkDiskSource> disk = vtkSmartPointer<vtkDiskSource>::New();
|
vtkSmartPointer<vtkDiskSource> disk = vtkSmartPointer<vtkDiskSource>::New();
|
||||||
// Maybe the resolution should be lower e.g. 50 or 25
|
disk->SetCircumferentialResolution(30);
|
||||||
disk->SetCircumferentialResolution(50);
|
|
||||||
disk->SetInnerRadius(radius - thickness);
|
disk->SetInnerRadius(radius - thickness);
|
||||||
disk->SetOuterRadius(radius + thickness);
|
disk->SetOuterRadius(radius + thickness);
|
||||||
|
disk->Update();
|
||||||
// Set the circle origin
|
|
||||||
vtkSmartPointer<vtkTransform> t = vtkSmartPointer<vtkTransform>::New();
|
|
||||||
t->Identity();
|
|
||||||
t->Translate(pt.x, pt.y, pt.z);
|
|
||||||
|
|
||||||
vtkSmartPointer<vtkTransformPolyDataFilter> tf = vtkSmartPointer<vtkTransformPolyDataFilter>::New();
|
|
||||||
tf->SetTransform(t);
|
|
||||||
tf->SetInputConnection(disk->GetOutputPort());
|
|
||||||
tf->Update();
|
|
||||||
|
|
||||||
vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
|
vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
|
||||||
VtkUtils::SetInputData(mapper, tf->GetOutput());
|
VtkUtils::SetInputData(mapper, disk->GetOutput());
|
||||||
|
|
||||||
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
|
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
|
||||||
|
actor->GetProperty()->LightingOff();
|
||||||
actor->SetMapper(mapper);
|
actor->SetMapper(mapper);
|
||||||
|
|
||||||
WidgetAccessor::setProp(*this, actor);
|
WidgetAccessor::setProp(*this, actor);
|
||||||
setColor(color);
|
setColor(color);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
cv::viz::WCircle::WCircle(double radius, const Point3d& center, const Vec3d& normal, double thickness, const Color &color)
|
||||||
|
{
|
||||||
|
Vec3d arbitrary = get_random_vec();
|
||||||
|
Vec3d zvec = normalized(normal);
|
||||||
|
Vec3d xvec = normalized(zvec.cross(arbitrary));
|
||||||
|
Vec3d yvec = zvec.cross(xvec);
|
||||||
|
|
||||||
|
WCircle circle(radius, thickness, color);
|
||||||
|
circle.applyTransform(makeTransformToGlobal(xvec, yvec, zvec, center));
|
||||||
|
*this = circle;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<> cv::viz::WCircle cv::viz::Widget::cast<cv::viz::WCircle>()
|
template<> cv::viz::WCircle cv::viz::Widget::cast<cv::viz::WCircle>()
|
||||||
|
@ -293,7 +293,9 @@ TEST(Viz, show_simple_widgets)
|
|||||||
Viz3d viz("show_simple_widgets");
|
Viz3d viz("show_simple_widgets");
|
||||||
viz.showWidget("coos", WCoordinateSystem());
|
viz.showWidget("coos", WCoordinateSystem());
|
||||||
viz.showWidget("cube", WCube());
|
viz.showWidget("cube", WCube());
|
||||||
viz.showWidget("arr3", WArrow(Vec3d::all(-0.5), Vec3d::all(0.5), 0.009, Color::raspberry()));
|
viz.showWidget("arro", WArrow(Vec3d::all(-0.5), Vec3d::all(0.5), 0.009, Color::raspberry()));
|
||||||
|
viz.showWidget("cir1", WCircle(0.5, 0.01, Color::bluberry()));
|
||||||
|
viz.showWidget("cir2", WCircle(0.5, Point3d(0.5, 0.0, 0.0), Vec3d(1.0, 0.0, 0.0), 0.01, Color::apricot()));
|
||||||
viz.spin();
|
viz.spin();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user