Visa ett inlägg
Oläst 2008-04-30, 08:09 #6
etanders etanders är inte uppkopplad
Medlem
 
Reg.datum: Dec 2004
Inlägg: 160
etanders etanders är inte uppkopplad
Medlem
 
Reg.datum: Dec 2004
Inlägg: 160
Har haft mycket annat att göra, så det tog några dagar. Hoppas du i alla fall kan ha någon nytta av detta.

Jag har inga testdata så jag har inte kontrollerat att konverteringen stämmer, men jag får i alla fall tillbaka samma värden om jag konverterar godtyckliga värden RT90 -> Sweref99 -> RT90. Jag har bara utgått från formeln på wikipedia, och de siffervärden som finns där har jag satt som konstanter. Behöver de ändras i programmet får du ju göra om det på något sätt, kanske genom att skicka in aktuella värden till konstruktorn eller nåt.

Så här använder du min lilla konverterare:

Kod:
double x_RT90= 123;
double y_RT90 = 456;
double z_RT90 = 789;
double x_Sweref99;
double y_Sweref99;
double z_Sweref99;

Converter c = new Converter();
c.FromRT90ToSweref99(x_RT90, y_RT90, z_RT90, out x_Sweref99, out y_Sweref99, out z_Sweref99);
Och så själva koden:

Kod:
using System;

public class Converter
{
	public const double deltaX = -414.0978567149;
	public const double deltaY = -41.3381489658;
	public const double deltaZ = -603.0627177516;

	public const double omegaX = -0.8550434314;
	public const double omegaY = 2.1413465185;
	public const double omegaZ = -7.0227209516;

	public const double smallDelta = 0d;

	public Vector Delta
	{
 get
 {
 	Vector delta = new Vector();

 	delta.SetElement(0, deltaX);
 	delta.SetElement(1, deltaY);
 	delta.SetElement(2, deltaZ);

 	return delta;
 }
	}

	public Matrix R
	{
 get
 {
 	double sx = Math.Sin(omegaX);
 	double cx = Math.Cos(omegaX);
 	double sy = Math.Sin(omegaY);
 	double cy = Math.Cos(omegaY);
 	double sz = Math.Sin(omegaZ);
 	double cz = Math.Cos(omegaZ);

 	Matrix r = new Matrix();

 	r.SetElement(0, 0, cy * cz);
 	r.SetElement(0, 1, cz * sx * sy + cx * sz);
 	r.SetElement(0, 2, -cx * cz * sy + sx * sz);

 	r.SetElement(1, 0, -cy * sz);
 	r.SetElement(1, 1, cx * cz - sx * sy * sz);
 	r.SetElement(1, 2, cz * sx + cx * sy * sz);

 	r.SetElement(2, 0, sy);
 	r.SetElement(2, 1, -cy * sx);
 	r.SetElement(2, 2, cx * cy);

 	return r;
 }
	}

	public Matrix InverseR
	{
 get
 {
 	double sx = Math.Sin(omegaX);
 	double cx = Math.Cos(omegaX);
 	double sy = Math.Sin(omegaY);
 	double cy = Math.Cos(omegaY);
 	double sz = Math.Sin(omegaZ);
 	double cz = Math.Cos(omegaZ);

 	Matrix r = new Matrix();

 	r.SetElement(0, 0, cy * cz);
 	r.SetElement(0, 1, -cy * sz);
 	r.SetElement(0, 2, sy);

 	r.SetElement(1, 0, cz * sx * sy + cx * sz);
 	r.SetElement(1, 1, cx * cz - sx * sy * sz);
 	r.SetElement(1, 2, -cy * sx);

 	r.SetElement(2, 0, -cx * cz * sy + sx * sz);
 	r.SetElement(2, 1, cz * sx + cx * sy * sz);
 	r.SetElement(2, 2, cx * cy);

 	return r;
 }
	}

	public void FromSweref99ToRT90(double x_Sweref99, double y_Sweref99, double z_Sweref99,
 out double x_RT90, out double y_RT90, out double z_RT90)
	{
 Vector Sweref99 = new Vector();
 Sweref99.SetElement(0, x_Sweref99);
 Sweref99.SetElement(1, y_Sweref99);
 Sweref99.SetElement(2, z_Sweref99);

 Vector RT90 = MatrixMath.VectorAddition(
 	Delta,
 	MatrixMath.ScalarVectorMultiplication(
  1 + smallDelta,
  MatrixMath.MatrixVectorMultiplication(
  	R,
  	Sweref99)));

 x_RT90 = RT90.GetElement(0);
 y_RT90 = RT90.GetElement(1);
 z_RT90 = RT90.GetElement(2);
	}

	public void FromRT90ToSweref99(double x_RT90, double y_RT90, double z_RT90,
 out double x_Sweref99, out double y_Sweref99, out double z_Sweref99)
	{
 Vector RT90 = new Vector();
 RT90.SetElement(0, x_RT90);
 RT90.SetElement(1, y_RT90);
 RT90.SetElement(2, z_RT90);

 Vector Sweref99 = MatrixMath.ScalarVectorMultiplication(
 	1 / (1 + smallDelta),
 	MatrixMath.MatrixVectorMultiplication(
  InverseR,
  MatrixMath.VectorAddition(
  	RT90,
  	MatrixMath.ScalarVectorMultiplication(
   -1,
   Delta))));

 x_Sweref99 = Sweref99.GetElement(0);
 y_Sweref99 = Sweref99.GetElement(1);
 z_Sweref99 = Sweref99.GetElement(2);
	}
}
Kod:
public class Matrix
{
	private static readonly int Dim = 3;
	private readonly double[,] m_elements;

	public Matrix()
	{
 m_elements = new double[Dim, Dim];
	}

	public static int Dimension
	{
 get { return Dim; }
	}

	public void SetElement(int i, int j, double value)
	{
 m_elements[i, j] = value;
	}

	public double GetElement(int i, int j)
	{
 return m_elements[i, j];
	}
}
Kod:
public class Vector
{
	private static readonly int Dim = 3;
	private readonly double[] m_elements;

	public Vector()
	{
 m_elements = new double[Dim];
	}

	public static int Dimension
	{
 get { return Dim; }
	}

	public void SetElement(int i, double value)
	{
 m_elements[i] = value;
	}

	public double GetElement(int i)
	{
 return m_elements[i];
	}
}
Kod:
public class MatrixMath
{
	public static Matrix MatrixMultiplication(Matrix m1, Matrix m2)
	{
 Matrix m = new Matrix();

 for (int i = 0; i < Matrix.Dimension; i++)
 {
 	for (int j = 0; j < Matrix.Dimension; j++)
 	{
  double value = 0.0;
  for (int k = 0; k < Matrix.Dimension; k++)
  {
  	value += m1.GetElement(i, k) * m2.GetElement(k, j);
  }
  m.SetElement(i, j, value);
 	}
 }

 return m;
	}

	public static Vector MatrixVectorMultiplication(Matrix m, Vector v)
	{
 Vector v2 = new Vector();

 for (int i = 0; i < Vector.Dimension; i++)
 {
 	double value = 0.0;
 	for (int j = 0; j < Vector.Dimension; j++)
 	{
  value += m.GetElement(i, j) * v.GetElement(j);
 	}
 	v2.SetElement(i, value);
 }

 return v2;
	}

	public static Vector ScalarVectorMultiplication(double scalar, Vector v)
	{
 Vector v2 = new Vector();

 for (int i = 0; i < Vector.Dimension; i++)
 {
 	v2.SetElement(i, scalar * v.GetElement(i));
 }

 return v2;
	}

	public static Vector VectorAddition(Vector v1, Vector v2)
	{
 Vector v = new Vector();

 for (int i = 0; i < Vector.Dimension; i++)
 {
 	v.SetElement(i, v1.GetElement(i) + v2.GetElement(i));
 }

 return v;
	}
}
etanders är inte uppkopplad   Svara med citatSvara med citat