⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vector2d.cpp

📁 Displaying large amounts of technical data in a chart can be a frustrating task. You can find tons o
💻 CPP
字号:
#include "stdafx.h"
#include "vector2d.h"
#include <math.h>


PVECTOR2D   vSubtractVectors(PVECTOR2D v0, PVECTOR2D v1, PVECTOR2D v)
{
  if (v0 == NULL || v1 == NULL)
    v = (PVECTOR2D)NULL;
  else
  {
    v->x = v0->x - v1->x;
    v->y = v0->y - v1->y;
  }
  return(v);
}


PVECTOR2D   vAddVectors(PVECTOR2D v0, PVECTOR2D v1, PVECTOR2D v)
{
  if (v0 == NULL || v1 == NULL)
    v = (PVECTOR2D)NULL;
  else
  {
    v->x = v0->x + v1->x;
    v->y = v0->y + v1->y;
  }
  return(v);
}

PVECTOR2D   vScaleVector(PVECTOR2D v0, double dScaling, PVECTOR2D v)
{
  if (v0 == NULL)
    v = (PVECTOR2D)NULL;
  else
  {
    if (dScaling != 0)
    {
      v->x = (v0->x *= dScaling);
      v->y = (v0->y *= dScaling);
	}
  }
  return(v);
}

PVECTOR2D   vLinearCombination(PVECTOR2D vScale, PVECTOR2D v0, PVECTOR2D v1, PVECTOR2D v)
{
  if (vScale == NULL || v0 == NULL || v1 == NULL)
    v = (PVECTOR2D)NULL;
  else
  {
    v->x = vScale->x * v0->x + vScale->y * v1->x;
    v->y = vScale->x * v0->y + vScale->y * v1->y;
  }
  return(v);
}


double   vVectorSquared(PVECTOR2D v0)
{
  double dSqLen;

  if (v0 == NULL)
    dSqLen = 0.0;
  else
    dSqLen = (double)(v0->x * v0->x) + (double)(v0->y * v0->y);
  return (dSqLen);
}


double   vVectorMagnitude(PVECTOR2D v0)
{
  double dMagnitude;

  if (v0 == NULL)
    dMagnitude = 0.0;
  else
    dMagnitude = sqrt(vVectorSquared(v0));
  return (dMagnitude);
}


void   vNormalizeVector(PVECTOR2D v0)
{
  double dMagnitude = vVectorMagnitude(v0);

  v0->x /= dMagnitude;
  v0->y /= dMagnitude;
}


double   vDotProduct(PVECTOR2D v0, PVECTOR2D v1)
{
  return ((v0 == NULL || v1 == NULL) ? 0.0 
                                     : (v0->x * v1->x) + (v0->y * v1->y));
}

PVECTOR2D   vNormalVector(PVECTOR2D v0, PVECTOR2D v)
{
  if (v0 == NULL)
    v = (PVECTOR2D)NULL;
  else
  {
    v->x = -v0->y;
    v->y = v0->x;
  }
  return(v);
}

double   vVectorAngle(PVECTOR2D v0, PVECTOR2D v1)
{
  double vangle;

  if (v0 == NULL || v1 == NULL)
    vangle = 0.0;
  else
  {
    vNormalizeVector(v0);
    vNormalizeVector(v1);
	vangle = vDotProduct(v0, v1);
  }
  return(vangle);
}

BOOL   vPointNormalForm(POINT pt0, POINT pt1, PPOINTNORMAL ppnPointNormal)
{
  VECTOR2D v, vNormal;

  POINTS2VECTOR2D(pt0, pt1, v);

  if (v.x == 0 && v.y == 0)
    return(FALSE);

  vNormalVector(&v, &vNormal);

  ppnPointNormal->vNormal.x = vNormal.x;
  ppnPointNormal->vNormal.y = vNormal.y;
  ppnPointNormal->D = vDotProduct(&vNormal, (PVECTOR2D)&pt0);
  return(TRUE);
}

void   vProjectAndResolve(PVECTOR2D v0, PVECTOR2D v1, PPROJECTION ppProj)
{
  VECTOR2D ttProjection, ttOrthogonal;
  double proj1;
  //
  //obtain projection vector
  //
  //c = a * b
  //    ----- b
  //    |b|^2
  //
  proj1 = vDotProduct(v0, v1)/vDotProduct(v1, v1);
  ttProjection.x = v1->x * proj1;
  ttProjection.y = v1->y * proj1;
  //
  //obtain perpendicular projection : e = a - c
  //
  vSubtractVectors(v0, &ttProjection, &ttOrthogonal);
  //
  //fill PROJECTION structure with appropriate values
  //
  ppProj->LenProjection = vVectorMagnitude(&ttProjection);
  ppProj->LenPerpProjection = vVectorMagnitude(&ttOrthogonal);

  ppProj->ttProjection.x = ttProjection.x;
  ppProj->ttProjection.y = ttProjection.y;
  ppProj->ttPerpProjection.x = ttOrthogonal.x;
  ppProj->ttPerpProjection.y = ttOrthogonal.y;
}

BOOL   vIsPerpendicular(PVECTOR2D v0, PVECTOR2D v1)
{
  double product;

  if (v0 == NULL || v1 == NULL)
    product = 0.0;
  else
    product = vDotProduct(v0, v1);

  return (((product == 0.0) ? TRUE : FALSE));
}


double   vDistFromPointToLine(LPPOINT pt0, LPPOINT pt1, LPPOINT ptTest)
{
  VECTOR2D ttLine, ttTest;
  PROJECTION pProjection;

  POINTS2VECTOR2D(*pt0, *pt1, ttLine);
  POINTS2VECTOR2D(*pt0, *ptTest, ttTest);

  vProjectAndResolve(&ttTest, &ttLine, &pProjection);
 
  return(pProjection.LenPerpProjection);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -