En ocasiones puede que necesites conocer el punto de corte de un punto proyectado perpendicularmente a una línea recta. Con esta sencilla función podrás obtener ese punto.
A continuación el código de la función:
/// <summary>
/// Obtiene el punto perpendicular a una recta respecto a otro punto
/// </summary>
/// <param name=”pt“>Punto de referencia</param>
/// <param name=”StartPoint“>Punto inicial de la recta</param>
/// <param name=”EndPoint“>Punto final de la recta</param>
/// <param name=”precision“>Grado de precisión decimal</param>
/// <returns>El punto perpendicular a la recta representada por dos puntos</returns>
public static Point3D PerpendPoint (Point3D pt, Point3D StartPoint, Point3D EndPoint, int precision)
{
double y = ((EndPoint.y – StartPoint.y) * (pt.x – StartPoint.x) –
(EndPoint.x – StartPoint.x) * (pt.y – StartPoint.y)) /
(Math.Pow(EndPoint.y – StartPoint.y, 2) +
Math.Pow(EndPoint.x – StartPoint.x, 2));
double x = pt.x – (EndPoint.y * y – StartPoint.y * y);
double num = pt.y + (EndPoint.x * y – StartPoint.x * y);
double z = pt.z + (EndPoint.z * y – StartPoint.z * y);
return new Point3D(x, num, z);
}
Para poner a prueba la función puedes crear un formulario parecido al siguiente:
A continuación el código para los eventos de los controles para el formulario:
private void txtPt1X_KeyPress(object sender, KeyPressEventArgs e)
{
TextBox tb = sender as TextBox;
string antT = tb.Text;
string t = tb.Text;
e.Handled = MyClase.OnlyNumbers(e.KeyChar.ToString(), true, ref t);
if (antT != t)
{
tb.Text = t;
tb.SelectionStart = tb.Text.Length;
}
}
private void txtPt1Y_KeyPress(object sender, KeyPressEventArgs e)
{
TextBox tb = sender as TextBox;
string antT = tb.Text;
string t = tb.Text;
e.Handled = MyClase.OnlyNumbers(e.KeyChar.ToString(), true, ref t);
if (antT != t)
{
tb.Text = t;
tb.SelectionStart = tb.Text.Length;
}
}
private void txtPt1Z_KeyPress(object sender, KeyPressEventArgs e)
{
TextBox tb = sender as TextBox;
string antT = tb.Text;
string t = tb.Text;
e.Handled = MyClase.OnlyNumbers(e.KeyChar.ToString(), true, ref t);
if (antT != t)
{
tb.Text = t;
tb.SelectionStart = tb.Text.Length;
}
}
private void txtPt2X_KeyPress(object sender, KeyPressEventArgs e)
{
TextBox tb = sender as TextBox;
string antT = tb.Text;
string t = tb.Text;
e.Handled = MyClase.OnlyNumbers(e.KeyChar.ToString(), true, ref t);
if (antT != t)
{
tb.Text = t;
tb.SelectionStart = tb.Text.Length;
}
}
private void txtPt2Y_KeyPress(object sender, KeyPressEventArgs e)
{
TextBox tb = sender as TextBox;
string antT = tb.Text;
string t = tb.Text;
e.Handled = MyClase.OnlyNumbers(e.KeyChar.ToString(), true, ref t);
if (antT != t)
{
tb.Text = t;
tb.SelectionStart = tb.Text.Length;
}
}
private void txtPt2Z_KeyPress(object sender, KeyPressEventArgs e)
{
TextBox tb = sender as TextBox;
string antT = tb.Text;
string t = tb.Text;
e.Handled = MyClase.OnlyNumbers(e.KeyChar.ToString(), true, ref t);
if (antT != t)
{
tb.Text = t;
tb.SelectionStart = tb.Text.Length;
}
}
private void txtPtX_KeyPress(object sender, KeyPressEventArgs e)
{
TextBox tb = sender as TextBox;
string antT = tb.Text;
string t = tb.Text;
e.Handled = MyClase.OnlyNumbers(e.KeyChar.ToString(), true, ref t);
if (antT != t)
{
tb.Text = t;
tb.SelectionStart = tb.Text.Length;
}
}
private void txtPtY_KeyPress(object sender, KeyPressEventArgs e)
{
TextBox tb = sender as TextBox;
string antT = tb.Text;
string t = tb.Text;
e.Handled = MyClase.OnlyNumbers(e.KeyChar.ToString(), true, ref t);
if (antT != t)
{
tb.Text = t;
tb.SelectionStart = tb.Text.Length;
}
}
private void txtPtZ_KeyPress(object sender, KeyPressEventArgs e)
{
TextBox tb = sender as TextBox;
string antT = tb.Text;
string t = tb.Text;
e.Handled = MyClase.OnlyNumbers(e.KeyChar.ToString(), true, ref t);
if (antT != t)
{
tb.Text = t;
tb.SelectionStart = tb.Text.Length;
}
}
private void txtPrecision_KeyPress(object sender, KeyPressEventArgs e)
{
TextBox tb = sender as TextBox;
string antT = tb.Text;
string t = tb.Text;
e.Handled = MyClase.OnlyNumbers(e.KeyChar.ToString(), false, ref t);
if (antT != t)
{
tb.Text = t;
tb.SelectionStart = tb.Text.Length;
}
}
private void btCalcular_Click(object sender, EventArgs e)
{
this.lblMsg.Text = “Mensaje:”;
this.lblX.Text = “0”;
this.lblY.Text = “0”;
this.lblZ.Text = “0”;
// Verificar los valores en los TextBox
if (!MyClase.IsNumeric(this.txtPt1X.Text) ||
!MyClase.IsNumeric(this.txtPt1Y.Text) ||
!MyClase.IsNumeric(this.txtPt1Z.Text) ||
!MyClase.IsNumeric(this.txtPt2X.Text) ||
!MyClase.IsNumeric(this.txtPt2Y.Text) ||
!MyClase.IsNumeric(this.txtPt2Z.Text) ||
!MyClase.IsNumeric(this.txtPtX.Text) ||
!MyClase.IsNumeric(this.txtPtY.Text) ||
!MyClase.IsNumeric(this.txtPtZ.Text) ||
!MyClase.IsNumeric(this.txtPrecision.Text))
{
this.lblMsg.Text = “Mensaje: Formato erróneo en los números o en la precisión.”;
}
Point3D StartPoint = new Point3D(this.txtPt1X.ToDouble(), this.txtPt1Y.ToDouble(), this.txtPt1Z.ToDouble());
Point3D EndPoint = new Point3D(this.txtPt2X.ToDouble(), this.txtPt2Y.ToDouble(), this.txtPt2Z.ToDouble());
Point3D RefPoint = new Point3D(this.txtPtX.ToDouble(), this.txtPtY.ToDouble(), this.txtPtZ.ToDouble());
double Precision = this.txtPrecision.ToInteger();
Point3D PtResult = MyClase.PerpendPoint(RefPoint, StartPoint, EndPoint, Convert.ToInt16(Precision));
this.lblX.Text = MyClase.Trunk(PtResult.x, Convert.ToInt16(Precision)).ToString();
this.lblY.Text = MyClase.Trunk(PtResult.y, Convert.ToInt16(Precision)).ToString();
this.lblZ.Text = MyClase.Trunk(PtResult.z, Convert.ToInt16(Precision)).ToString();
}
Si todo ha ido bien deberías tener un resultado parecido al siguiente:
Ponlo a prueba, piensa en cómo mejorarlo y comparte con nosotros tus progresos.