Files
Slnkdwf/Whiptk770/whiptk/logical_point.cpp
Jos Groot Lipman 0e37d774d2 Merge SLNKDWF64 branch
svn path=/Slnkdwf/trunk/; revision=23911
2015-01-21 12:09:31 +00:00

100 lines
4.4 KiB
C++

// Copyright (c) 1996-2006 by Autodesk, Inc.
//
// By using this code, you are agreeing to the terms and conditions of
// the License Agreement included in the documentation for this code.
//
// AUTODESK MAKES NO WARRANTIES, EXPRESS OR IMPLIED, AS TO THE CORRECTNESS
// OF THIS CODE OR ANY DERIVATIVE WORKS WHICH INCORPORATE IT. AUTODESK
// PROVIDES THE CODE ON AN "AS-IS" BASIS AND EXPLICITLY DISCLAIMS ANY
// LIABILITY, INCLUDING CONSEQUENTIAL AND INCIDENTAL DAMAGES FOR ERRORS,
// OMISSIONS, AND OTHER PROBLEMS IN THE CODE.
//
// Use, duplication, or disclosure by the U.S. Government is subject to
// restrictions set forth in FAR 52.227-19 (Commercial Computer Software
// Restricted Rights) and DFAR 252.227-7013(c)(1)(ii) (Rights in Technical
// Data and Computer Software), as applicable.
//
// $Header: /NewRoot/DWF Toolkit/v6/develop/global/src/dwf/whiptk/logical_point.cpp 1 9/12/04 8:54p Evansg $
#include "whiptk/pch.h"
///////////////////////////////////////////////////////////////////////////
WT_Boolean WT_Logical_Point::operator== (WT_Logical_Point_16 const & lp) const
{
if (m_x == (WT_Integer32)lp.m_x &&
m_y == (WT_Integer32)lp.m_y)
return WD_True;
else
return WD_False;
}
///////////////////////////////////////////////////////////////////////////
WT_Logical_Point const & WT_Logical_Point::operator= (WT_Logical_Point_16 const & in)
{
m_x = (WT_Integer32) in.m_x;
m_y = (WT_Integer32) in.m_y;
return *this;
}
///////////////////////////////////////////////////////////////////////////
const double myPI = 3.14159265358979323846;
/////////////////////////
WT_Logical_Point const WT_Logical_Point::operator* (WT_Transform const & trans) const
{
WT_Logical_Point new_point;
// new_point.m_x = (WT_Integer32) ( ((double)m_x + trans.m_translate.m_x) * trans.m_x_scale );
// new_point.m_y = (WT_Integer32) ( ((double)m_y + trans.m_translate.m_y) * trans.m_y_scale );
switch (trans.rotation())
{
case 0:
new_point.m_x = (WT_Integer32) (((double)m_x * trans.m_x_scale) + trans.m_translate.m_x);
new_point.m_y = (WT_Integer32) (((double)m_y * trans.m_y_scale) + trans.m_translate.m_y);
break;
case 90:
new_point.m_x = 0x7FFFFFFF - ((WT_Integer32) (((double)m_y * trans.m_y_scale) + trans.m_translate.m_y));
new_point.m_y = (WT_Integer32) (((double)m_x * trans.m_x_scale) + trans.m_translate.m_x);
break;
case 180:
new_point.m_x = 0x7FFFFFFF - ((WT_Integer32) (((double)m_x * trans.m_x_scale) + trans.m_translate.m_x));
new_point.m_y = 0x7FFFFFFF - ((WT_Integer32) (((double)m_y * trans.m_y_scale) + trans.m_translate.m_y));
break;
case 270:
new_point.m_x = (WT_Integer32) (((double)m_y * trans.m_y_scale) + trans.m_translate.m_y);
new_point.m_y = 0x7FFFFFFF - ((WT_Integer32) (((double)m_x * trans.m_x_scale) + trans.m_translate.m_x));
break;
default:
{
// Merk op: de code hierboven roteert om (INT_MAX/2, INT_MAX/2)
// Bij 90 graden rotaties heb je dan geen kans op overflow.
// Bij andere hoeken kan het wel mis gaan. Wij roteren hieronder
// daarom om 0,0. Dat blijkt in de praktijk goed te gaan?
double sinAngle = sin((double)trans.rotation() / 180.0 * myPI);
double cosAngle = cos((double)trans.rotation() / 180.0 * myPI);
double transx = (double)m_x * trans.m_x_scale + trans.m_translate.m_x;
double transy = (double)m_y * trans.m_y_scale + trans.m_translate.m_y;
double newx = transx * cosAngle - transy * sinAngle;
double newy = transy * cosAngle + transx * sinAngle;
// if (newx>INT_MAX || newy>INT_MAX || newx<INT_MIN || newy<INT_MIN)
// DebugBreak();
new_point.m_x = (WT_Integer32)newx;
new_point.m_y = (WT_Integer32)newy;
//throw WT_Result::Internal_Error;
}
}
return new_point;
}
///////////////////////////////////////////////////////////////////////////
WT_Logical_Point const WT_Logical_Point::operator*= (WT_Transform const & trans)
{
// Need a temp copy since with some rotations will be mucking with intermediate terms
WT_Logical_Point orig_point(m_x, m_y);
*this = orig_point * trans;
return *this;
}