SLNKDWF 2.11
svn path=/Slnkdwf/trunk/; revision=12487
This commit is contained in:
99
Whiptk702/logical_point.cpp
Normal file
99
Whiptk702/logical_point.cpp
Normal file
@@ -0,0 +1,99 @@
|
||||
// Copyright (c) 1996-2001 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;
|
||||
}
|
||||
Reference in New Issue
Block a user