void RotatePoint( wxPoint* point, const wxPoint& centre, double angle ) { int ox, oy; ox = point->x - centre.x; oy = point->y - centre.y; RotatePoint( &ox, &oy, angle ); point->x = ox + centre.x; point->y = oy + centre.y; }
bool TEXTE_MODULE::TextHitTest( const wxPoint& aPoint, int aAccuracy ) const { EDA_RECT rect = GetTextBox( -1 ); wxPoint location = aPoint; rect.Inflate( aAccuracy ); RotatePoint( &location, GetTextPos(), -GetDrawRotation() ); return rect.Contains( location ); }
EDA_RECT LIB_TEXT::GetBoundingBox() const { /* Y coordinates for LIB_ITEMS are bottom to top, so we must invert the Y position when * calling GetTextBox() that works using top to bottom Y axis orientation. */ EDA_RECT rect = GetTextBox( -1, -1, true ); wxPoint orig = rect.GetOrigin(); wxPoint end = rect.GetEnd(); NEGATE( orig.y); NEGATE( end.y); RotatePoint( &orig, m_Pos, -m_Orient ); RotatePoint( &end, m_Pos, -m_Orient ); rect.SetOrigin( orig ); rect.SetEnd( end ); rect.Normalize(); return rect; }
void LIB_POLYLINE::Rotate( const wxPoint& aCenter, bool aRotateCCW ) { int rot_angle = aRotateCCW ? -900 : 900; size_t i, imax = m_PolyPoints.size(); for( i = 0; i < imax; i++ ) { RotatePoint( &m_PolyPoints[i], aCenter, rot_angle ); } }
//Draws radar arm at new angle void DrawRadarArm(float radAngle) { //Erase old line DrawLine(radarX, radarY, sweepArm.x, sweepArm.y, BLACK); //define 'north' tip position of sweep arm sweepArm.x=radarX; sweepArm.y=radarY-16; //Rotate point about centre RotatePoint(&sweepArm, radarX, radarY, radAngle); //Draw new arm DrawLine(radarX,radarY, sweepArm.x, sweepArm.y, GREEN); }
void EDA_TEXT::GetPositionsOfLinesOfMultilineText( std::vector<wxPoint>& aPositions, int aLineCount ) const { wxPoint pos = m_Pos; // Position of first line of the // multiline text according to // the center of the multiline text block wxPoint offset; // Offset to next line. offset.y = GetInterline(); if( aLineCount > 1 ) { switch( m_VJustify ) { case GR_TEXT_VJUSTIFY_TOP: break; case GR_TEXT_VJUSTIFY_CENTER: pos.y -= ( aLineCount - 1 ) * offset.y / 2; break; case GR_TEXT_VJUSTIFY_BOTTOM: pos.y -= ( aLineCount - 1 ) * offset.y; break; } } // Rotate the position of the first line // around the center of the multiline text block RotatePoint( &pos, m_Pos, m_Orient ); // Rotate the offset lines to increase happened in the right direction RotatePoint( &offset, m_Orient ); for( int ii = 0; ii < aLineCount; ii++ ) { aPositions.push_back( pos ); pos += offset; } }
void ViewerRenderer::Isometric() { Top(); float cameraPosition[3], cameraTarget[3], cameraUp[3], axis[3], origin[3]; GetCamera(cameraPosition, cameraTarget, cameraUp); axis[0] = -1.0f / (float)sqrt(2.0); axis[1] = 1.0f / (float)sqrt(2.0); axis[2] = 0; RotatePoint(cameraPosition, 45, cameraTarget, axis, cameraPosition); cameraUp[0] = -1; cameraUp[1] = -1; cameraUp[2] = 0; origin[0] = 0; origin[1] = 0; origin[2] = 0; RotatePoint(cameraUp, 45, origin, axis, cameraUp); SetCamera(cameraPosition, cameraTarget, cameraUp); }
void RotatePoint( double* pX, double* pY, double cx, double cy, double angle ) { double ox, oy; ox = *pX - cx; oy = *pY - cy; RotatePoint( &ox, &oy, angle ); *pX = ox + cx; *pY = oy + cy; }
void RotatePoint( int* pX, int* pY, int cx, int cy, double angle ) { int ox, oy; ox = *pX - cx; oy = *pY - cy; RotatePoint( &ox, &oy, angle ); *pX = ox + cx; *pY = oy + cy; }
//=========================================================================== // // Parameter: - // Returns: - // Changes Globals: - //=========================================================================== int AAS_TransformPlane(int planenum, vec3_t origin, vec3_t angles) { float newdist, matrix[3][3]; vec3_t normal; //rotate the node plane VectorCopy(mapplanes[planenum].normal, normal); CreateRotationMatrix(angles, matrix); RotatePoint(normal, matrix); newdist = mapplanes[planenum].dist + DotProduct(normal, origin); return FindFloatPlane(normal, newdist); } //end of the function AAS_TransformPlane
void TEXTE_MODULE::Rotate( const wxPoint& aRotCentre, double aAngle ) { // Used in footprint edition // Note also in module editor, m_Pos0 = m_Pos wxPoint pt = GetTextPos(); RotatePoint( &pt, aRotCentre, aAngle ); SetTextPos( pt ); SetTextAngle( GetTextAngle() + aAngle ); SetLocalCoord(); }
/** * Function TransformRingToPolygon * Creates a polygon from a ring * Convert arcs to multiple straight segments * @param aCornerBuffer = a buffer to store the polygon * @param aCentre = centre of the arc or circle * @param aRadius = radius of the circle * @param aCircleToSegmentsCount = the number of segments to approximate a circle * @param aWidth = width (thickness) of the ring */ void TransformRingToPolygon( SHAPE_POLY_SET& aCornerBuffer, wxPoint aCentre, int aRadius, int aCircleToSegmentsCount, int aWidth ) { int delta = 3600 / aCircleToSegmentsCount; // rotate angle in 0.1 degree // Compute the corners posituions and creates poly wxPoint curr_point; int inner_radius = aRadius - ( aWidth / 2 ); int outer_radius = inner_radius + aWidth; aCornerBuffer.NewOutline(); // Draw the inner circle of the ring for( int ii = 0; ii < 3600; ii += delta ) { curr_point.x = inner_radius; curr_point.y = 0; RotatePoint( &curr_point, ii ); curr_point += aCentre; aCornerBuffer.Append( curr_point.x, curr_point.y ); } // Draw the last point of inner circle aCornerBuffer.Append( aCentre.x + inner_radius, aCentre.y ); // Draw the outer circle of the ring for( int ii = 0; ii < 3600; ii += delta ) { curr_point.x = outer_radius; curr_point.y = 0; RotatePoint( &curr_point, -ii ); curr_point += aCentre; aCornerBuffer.Append( curr_point.x, curr_point.y ); } // Draw the last point of outer circle aCornerBuffer.Append( aCentre.x + outer_radius, aCentre.y ); aCornerBuffer.Append( aCentre.x + inner_radius, aCentre.y ); }
void SCH_SHEET::Rotate(wxPoint aPosition) { RotatePoint( &m_pos, aPosition, 900 ); RotatePoint( &m_size.x, &m_size.y, 900 ); if( m_size.x < 0 ) { m_pos.x += m_size.x; m_size.x = -m_size.x; } if( m_size.y < 0 ) { m_pos.y += m_size.y; m_size.y = -m_size.y; } for( SCH_SHEET_PIN& sheetPin : m_pins ) { sheetPin.Rotate( aPosition ); } }
const EDA_RECT SCH_LABEL::GetBoundingBox() const { int linewidth = GetThickness() == 0 ? GetDefaultLineThickness() : GetThickness(); EDA_RECT rect = GetTextBox( -1, linewidth ); if( GetTextAngle() != 0.0 ) { // Rotate rect wxPoint pos = rect.GetOrigin(); wxPoint end = rect.GetEnd(); RotatePoint( &pos, GetTextPos(), GetTextAngle() ); RotatePoint( &end, GetTextPos(), GetTextAngle() ); rect.SetOrigin( pos ); rect.SetEnd( end ); rect.Normalize(); } return rect; }
void C_Quaternion::RotatePoint(C_Vector3* p1 , const C_Vector3* rotationPoint) const { C_Vector3 tmp; tmp.x = p1->x - rotationPoint->x; tmp.y = p1->y - rotationPoint->y; tmp.z = p1->z - rotationPoint->z; RotatePoint(&tmp); tmp.Translate(rotationPoint); p1->SetVector(tmp); }
void D_PAD::SetLocalCoord() { MODULE* module = (MODULE*) m_Parent; if( module == NULL ) { m_Pos0 = m_Pos; return; } m_Pos0 = m_Pos - module->GetPosition(); RotatePoint( &m_Pos0.x, &m_Pos0.y, -module->GetOrientation() ); }
// Returns the position of the pad. wxPoint D_PAD::ShapePos() const { if( m_Offset.x == 0 && m_Offset.y == 0 ) return m_Pos; wxPoint loc_offset = m_Offset; RotatePoint( &loc_offset, m_Orient ); wxPoint shape_pos = m_Pos + loc_offset; return shape_pos; }
/** * Place this drawable relative to its parent * * This works hierarchically from top item down. * \param offset Parent offset * \param rotate Parent rotation */ void CDrawable::Place(Gdiplus::Point offset, double rotate) { // Combine the transformation we are given with the transformation // for this object. mPlacedPosition = offset + RotatePoint(mPosition, rotate); mPlacedR = mRotation + rotate; // Update our children for (auto drawable : mChildren) { drawable->Place(mPlacedPosition, mPlacedR); } }
void GBR_TO_PCB_EXPORTER::export_segarc_copper_item( GERBER_DRAW_ITEM* aGbrItem, LAYER_NUM aLayer ) { double a = atan2( (double) ( aGbrItem->m_Start.y - aGbrItem->m_ArcCentre.y ), (double) ( aGbrItem->m_Start.x - aGbrItem->m_ArcCentre.x ) ); double b = atan2( (double) ( aGbrItem->m_End.y - aGbrItem->m_ArcCentre.y ), (double) ( aGbrItem->m_End.x - aGbrItem->m_ArcCentre.x ) ); wxPoint start = aGbrItem->m_Start; wxPoint end = aGbrItem->m_End; /* Because Pcbnew does not know arcs in tracks, * approximate arc by segments (SEG_COUNT__CIRCLE segment per 360 deg) * The arc is drawn in an anticlockwise direction from the start point to the end point. */ #define SEG_COUNT_CIRCLE 16 #define DELTA_ANGLE 2 * M_PI / SEG_COUNT_CIRCLE // calculate the number of segments from a to b. // we want CNT_PER_360 segments fo a circle if( a > b ) b += 2 * M_PI; wxPoint curr_start = start; wxPoint seg_start, seg_end; int ii = 1; for( double rot = a; rot < (b - DELTA_ANGLE); rot += DELTA_ANGLE, ii++ ) { seg_start = curr_start; wxPoint curr_end = start; RotatePoint( &curr_end, aGbrItem->m_ArcCentre, -RAD2DECIDEG( DELTA_ANGLE * ii ) ); seg_end = curr_end; // Reverse Y axis: NEGATE( seg_start.y ); NEGATE( seg_end.y ); writePcbLineItem( 0, TRACK_TYPE, seg_start, seg_end, aGbrItem->m_Size.x, aLayer, -1 ); curr_start = curr_end; } if( end != curr_start ) { seg_start = curr_start; seg_end = end; // Reverse Y axis: NEGATE( seg_start.y ); NEGATE( seg_end.y ); writePcbLineItem( 0, TRACK_TYPE, seg_start, seg_end, aGbrItem->m_Size.x, aLayer, -1 ); } }
/** * Function TransformArcToPolygon * Creates a polygon from an Arc * Convert arcs to multiple straight segments * @param aCornerBuffer = a buffer to store the polygon * @param aCentre = centre of the arc or circle * @param aStart = start point of the arc, or a point on the circle * @param aArcAngle = arc angle in 0.1 degrees. For a circle, aArcAngle = 3600 * @param aCircleToSegmentsCount = the number of segments to approximate a circle * @param aWidth = width (thickness) of the line */ void TransformArcToPolygon( SHAPE_POLY_SET& aCornerBuffer, wxPoint aCentre, wxPoint aStart, double aArcAngle, int aCircleToSegmentsCount, int aWidth ) { wxPoint arc_start, arc_end; int delta = 3600 / aCircleToSegmentsCount; // rotate angle in 0.1 degree arc_end = arc_start = aStart; if( aArcAngle != 3600 ) { RotatePoint( &arc_end, aCentre, -aArcAngle ); } if( aArcAngle < 0 ) { std::swap( arc_start, arc_end ); aArcAngle = -aArcAngle; } // Compute the ends of segments and creates poly wxPoint curr_end = arc_start; wxPoint curr_start = arc_start; for( int ii = delta; ii < aArcAngle; ii += delta ) { curr_end = arc_start; RotatePoint( &curr_end, aCentre, -ii ); TransformRoundedEndsSegmentToPolygon( aCornerBuffer, curr_start, curr_end, aCircleToSegmentsCount, aWidth ); curr_start = curr_end; } if( curr_end != arc_end ) TransformRoundedEndsSegmentToPolygon( aCornerBuffer, curr_end, arc_end, aCircleToSegmentsCount, aWidth ); }
void D_PAD::SetDrawCoord() { MODULE* module = (MODULE*) m_Parent; m_Pos = m_Pos0; if( module == NULL ) return; double angle = module->GetOrientation(); RotatePoint( &m_Pos.x, &m_Pos.y, angle ); m_Pos += module->GetPosition(); }
// Update "local" coordinates (coordinates relatives to the footprint // anchor point) void TEXTE_MODULE::SetLocalCoord() { MODULE* module = (MODULE*) m_Parent; if( module == NULL ) { m_Pos0 = m_Pos; return; } m_Pos0 = m_Pos - module->GetPosition(); double angle = module->GetOrientation(); RotatePoint( &m_Pos0.x, &m_Pos0.y, -angle ); }
const EDA_RECT LIB_TEXT::GetBoundingBox() const { /* Y coordinates for LIB_ITEMS are bottom to top, so we must invert the Y position when * calling GetTextBox() that works using top to bottom Y axis orientation. */ EDA_RECT rect = GetTextBox( -1, -1, true ); rect.RevertYAxis(); // We are using now a bottom to top Y axis. wxPoint orig = rect.GetOrigin(); wxPoint end = rect.GetEnd(); RotatePoint( &orig, GetTextPos(), -GetTextAngle() ); RotatePoint( &end, GetTextPos(), -GetTextAngle() ); rect.SetOrigin( orig ); rect.SetEnd( end ); // We are using now a top to bottom Y axis: rect.RevertYAxis(); return rect; }
EDA_RECT SCH_TEXT::GetBoundingBox() const { // We must pass the effective text thickness to GetTextBox // when calculating the bounding box int linewidth = ( m_Thickness == 0 ) ? GetDefaultLineThickness() : m_Thickness; linewidth = Clamp_Text_PenSize( linewidth, m_Size, m_Bold ); EDA_RECT rect = GetTextBox( -1, linewidth ); if( m_Orient ) // Rotate rect { wxPoint pos = rect.GetOrigin(); wxPoint end = rect.GetEnd(); RotatePoint( &pos, m_Pos, m_Orient ); RotatePoint( &end, m_Pos, m_Orient ); rect.SetOrigin( pos ); rect.SetEnd( end ); } rect.Normalize(); return rect; }
void TEXTE_MODULE::SetDrawCoord() { const MODULE* module = static_cast<const MODULE*>( m_Parent ); m_Pos = m_Pos0; if( module ) { double angle = module->GetOrientation(); RotatePoint( &m_Pos.x, &m_Pos.y, angle ); m_Pos += module->GetPosition(); } }
void TEXTE_MODULE::SetLocalCoord() { const MODULE* module = static_cast<const MODULE*>( m_Parent ); if( module ) { m_Pos0 = m_Pos - module->GetPosition(); double angle = module->GetOrientation(); RotatePoint( &m_Pos0.x, &m_Pos0.y, -angle ); } else { m_Pos0 = m_Pos; } }
void convertOblong2Segment( wxSize aSize, double aOrient, wxPoint& aStart, wxPoint& aEnd ) { wxSize size( aSize ); double orient = aOrient; /* The pad will be drawn as an oblong shape with size.y > size.x * (Oval vertical orientation 0) */ if( size.x > size.y ) { std::swap( size.x, size.y ); orient = AddAngles( orient, 900 ); } int deltaxy = size.y - size.x; // distance between centers of the oval int cx = 0; int cy = deltaxy / 2; RotatePoint( &cx, &cy, orient ); aStart = wxPoint( cx, cy ); cx = 0; cy = -deltaxy / 2; RotatePoint( &cx, &cy, orient ); aEnd = wxPoint( cx, cy ); }
void ZONE_CONTAINER::Rotate( const wxPoint& centre, double angle ) { wxPoint pos; for( unsigned ic = 0; ic < m_Poly->m_CornersList.GetCornersCount(); ic++ ) { pos = m_Poly->m_CornersList.GetPos( ic ); RotatePoint( &pos, centre, angle ); m_Poly->SetX( ic, pos.x ); m_Poly->SetY( ic, pos.y ); } m_Poly->Hatch(); /* rotate filled areas: */ for( SHAPE_POLY_SET::ITERATOR ic = m_FilledPolysList.Iterate(); ic; ++ic ) RotatePoint( &ic->x, &ic->y, centre.x, centre.y, angle ); for( unsigned ic = 0; ic < m_FillSegmList.size(); ic++ ) { RotatePoint( &m_FillSegmList[ic].m_Start, centre, angle ); RotatePoint( &m_FillSegmList[ic].m_End, centre, angle ); } }
void PSLIKE_PLOTTER::FlashPadRect( const wxPoint& aPadPos, const wxSize& aSize, double aPadOrient, EDA_DRAW_MODE_T aTraceMode, void* aData ) { static std::vector< wxPoint > cornerList; wxSize size( aSize ); cornerList.clear(); if( aTraceMode == FILLED ) SetCurrentLineWidth( 0 ); else SetCurrentLineWidth( USE_DEFAULT_LINE_WIDTH ); size.x -= GetCurrentLineWidth(); size.y -= GetCurrentLineWidth(); if( size.x < 1 ) size.x = 1; if( size.y < 1 ) size.y = 1; int dx = size.x / 2; int dy = size.y / 2; wxPoint corner; corner.x = aPadPos.x - dx; corner.y = aPadPos.y + dy; cornerList.push_back( corner ); corner.x = aPadPos.x - dx; corner.y = aPadPos.y - dy; cornerList.push_back( corner ); corner.x = aPadPos.x + dx; corner.y = aPadPos.y - dy; cornerList.push_back( corner ); corner.x = aPadPos.x + dx; corner.y = aPadPos.y + dy, cornerList.push_back( corner ); for( unsigned ii = 0; ii < cornerList.size(); ii++ ) { RotatePoint( &cornerList[ii], aPadPos, aPadOrient ); } cornerList.push_back( cornerList[0] ); PlotPoly( cornerList, ( aTraceMode == FILLED ) ? FILLED_SHAPE : NO_FILL, GetCurrentLineWidth() ); }
void HPGL_PLOTTER::FlashPadTrapez( const wxPoint& aPadPos, const wxPoint* aCorners, double aPadOrient, EDA_DRAW_MODE_T aTrace_Mode ) { std::vector< wxPoint > cornerList; cornerList.reserve( 4 ); for( int ii = 0; ii < 4; ii++ ) { wxPoint coord( aCorners[ii] ); RotatePoint( &coord, aPadOrient ); coord += aPadPos; cornerList.push_back( coord ); } PlotPoly( cornerList, aTrace_Mode == FILLED ? FILLED_SHAPE : NO_FILL ); }