Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
redsea_tq

Vẽ đường thẳng vuông góc?

Các bài được khuyến nghị

Các bác cho em hỏi có cách nào vẽ một đường thẳng từ một điểm cho trước vuông góc với một đối tượng(Line, Spline,Pline...) không ah?

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Các bác cho em hỏi có cách nào vẽ một đường thẳng từ một điểm cho trước vuông góc với một đối tượng(Line, Spline,Pline...) không ah?

1. Bạn hỏi cái này trong VBA, vậy liệu có phải là nhầm chủ đề rồi không?

2. Nếu bình thuờng thì cứ bắt điểm vuông góc (per) thôi.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Các bác cho em hỏi có cách nào vẽ một đường thẳng từ một điểm cho trước vuông góc với một đối tượng(Line, Spline,Pline...) không ah?

 

VD tìm điểm vuông góc với đường thẳng:

 

- Bài toán tổng quát trong không gian 3 chiều:

 

Gọi G là giao điểm vuông góc giữa đường thẳng qua M và đường thẳng có sẵn L.

 

G thuộc L --> phương trình tham số của L(t)

xG = StartPoint(0) + A*t

yG = StartPoint(1) + B*t

zG = StartPoint(2) + C*t

với (A,B,C) là vector chỉ phương của L, sử dụng thuộc tính L.Normal để xác định.

 

Gọi d là khoảng cách từ điểm M đến đường thẳng L

d^2 = (xG - xM)^2 + (yG - yM)^2 + (zG - zM)^2 [pt (1)]

 

Thay 3 tham số trên vào pt (1) --> phương trình bậc 2, ẩn là tham số t.

thay t vào 3 phương trình trên --> tọa độ G.

 

- Trong 2D:

Đường L có vector chỉ phương L.Normal (A, B ) và qua điểm L.StartPoint

Đường vuông góc có vector chỉ phương (-B,A) và qua điểm M (tích vô hướng = 0)

G là giao của 2 đường --> giải là xong

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Các bác cho em hỏi có cách nào vẽ một đường thẳng từ một điểm cho trước vuông góc với một đối tượng(Line, Spline,Pline...) không ah?

Bạn làm theo như bác anhcos chỉ là okê.

Với trường hợp là line mình có sẵn sub sau bạn có thể dùng luôn

Function distance(p1 As Variant, p2 As Variant) As Single
Dim x1, x2, y1, y2
x1 = p1(0): y1 = p1(1)
x2 = p2(0): y2 = p2(1)
distance = ((x1 - x2) ^ 2 + (y1 - y2) ^ 2) ^ 0.5
End Function

Sub linevuong(line As Object, p As Variant)
Dim p1 As Variant, p2 As Variant, pt(0 To 2) As Double
p1 = line.StartPoint
p2 = line.EndPoint
Dim circleObj As AcadCircle
Dim li As AcadLine
Dim radius As Double
radius = distance(p1, p)
Set circleObj = ThisDrawing.ModelSpace.AddCircle(p, radius)
Dim intPoints As Variant
intPoints = circleObj.IntersectWith(line, acExtendBoth)
pt(0) = (intPoints(0) + p1(0)) / 2: pt(1) = (intPoints(1) + p1(1)) / 2: pt(2) = 0
Set li = ThisDrawing.ModelSpace.AddLine(pt, p)
circleObj.Delete
End Sub

Sub ve()
Dim line As AcadLine
Dim pic As Double
Dim p As Double
Dim ob As AcadEntity
Dim l As AcadEntity
Dim po As Variant
ThisDrawing.Utility.GetEntity line, pic, "chon line"
po = ThisDrawing.Utility.GetPoint(, "chon diem: ")
linevuong line, po
End Sub

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Em gắn hệ trục toạ độ vào điểm cho trước và đường line vẽ trong không gian để dựng đường vuông góc bình thường như lời đáp của anh Pdle có nhược điểm gì so với dùng lisp???

Nếu các điểm của đường SPL và PL cùng nằm trong mặt phẳng trong không gian, việc dựng đường vuông góc với nó không khó.

Nhưng giả dụ các điểm của đường SPL và PL lại chạy loằng ngoằng trong không gian việc dựng hình có thực hiện được không???

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Nhưng giả dụ các điểm của đường SPL và PL lại chạy loằng ngoằng trong không gian việc dựng hình có thực hiện được không???

Cái này thực hiện bắt điểm và vẽ trên cad thì không vấn đề gì nhưng nếu là lập trình lisp hoặc VBA thì lại là cả một vất đề lớn như Bác anhcos đã đề câpk ở trên.

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Cám ơn anh em đã nhiệt tình giúp đỡ. Mình sẽ nghiên cứu sub về đường thẳng. nhưng vấn đề khó khăn ở đây là đường tròn và spline, cái này không biết anh em nào đã thử làm chưa cho mình tham khảo thuật toán cùng với. xin chân thành cám ơn anh em rất nhiều!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Cám ơn anh em đã nhiệt tình giúp đỡ. Mình sẽ nghiên cứu sub về đường thẳng. nhưng vấn đề khó khăn ở đây là đường tròn và spline, cái này không biết anh em nào đã thử làm chưa cho mình tham khảo thuật toán cùng với. xin chân thành cám ơn anh em rất nhiều!

 

SPLine thì mình chưa nghiên cứu, còn elip, đường tròn, point, line thì mình đã và đang làm.

 

Đã dịch thành thư viện, tải ở đây: anhcos.geometry.dll. (viết bằng C#)

Lưu ý: đây là bản đang phát triển, nên vẫn còn lỗi...

 

Cách dùng:

 

- Từ VB: dùng từ khóa Declare để import các cấu trúc dữ liệu từ dll. Cái này tự nghiên cứu, mình không rành.

 

- Từ VS:

Chèn vào đầu file

 

Imports Anhcos.Geometry

hoặc using Anhcos.Geometry

 

Các kiểu dữ liệu trong thư viện

 

PointD: cấu trúc điểm trong 3D

Vector: thông tin về vector, tính tích vô hướng, có hướng

Line:

Plane: Mặt phẳng

Circle

Ellipse

 

VD: Tìm hình chiếu G của M trên đường thẳng L

 

Dim M as new Point(Mx,My,Mz)

Dim L as new Line(LineObj.StartPoint,LineObj.EndPoint)

 

Dim G as PointD = M.Project(L) 'hình chiếu của M trên L

 

VD: Tìm hình chiếu G của M trên mặt phẳng chứa đường tròn C

 

Dim M as new Point(Mx,My,Mz)

Dim C as new Circle(CircleObj.Normal, CircleObj.Center, CircleObj.Radius)

 

Dim G as PointD = M.Project© 'hình chiếu của M trên C

 

Một đoạn code trong thư viện:

/// <summary>Cấu trúc điểm trong hệ tọa độ 3 chiều</summary>
   	public class PointD
   	{
       	/// <summary>Hoành độ của điểm</summary>
       	public double X;
       	/// <summary>Tung độ của điểm</summary>
       	public double Y;
       	/// <summary>Cao độ của điểm</summary>
       	public double Z;

       	/// <summary>Khởi tạo với 3 phần tử X,Y,Z đều bằng 0</summary>
       	public PointD()
       	{
           	X = Y= Z = 0;      	
       	}

       	/// <summary>Khởi tạo giá trị cho một điểm</summary>
       	public PointD(Single X, Single Y, Single Z)
       	{
           	this.X = (double)X;
           	this.Y = (double)Y;
           	this.Z = (double)Z;
       	}

       	/// <summary>Khởi tạo giá trị cho một điểm 2D</summary>
       	public PointD(Single X, Single Y)
       	{
           	this.X = (double)X;
           	this.Y = (double)Y;
           	this.Z = 0;
       	}

       	/// <summary>Khởi tạo giá trị cho một điểm</summary>
       	public PointD(double X, double Y, double Z)
       	{
           	this.X = X;
           	this.Y = Y;
           	this.Z = Z;
       	}

       	/// <summary>Khởi tạo giá trị cho một điểm 2D</summary>
       	public PointD(double X, double Y)
       	{
           	this.X = X;
           	this.Y = Y;
           	this.Z = 0;
       	}

       	/// <summary>Khởi tạo giá trị cho một điểm khi biết tham số t của đường thẳng</summary>
       	public PointD(Line L, double t)
       	{
           	X = L.M0.X + L.Normal.A * t;
           	Y = L.M0.Y + L.Normal.B * t;
           	Z = L.M0.Z + L.Normal.C * t;
       	}

       	/// <summary>Khởi tạo giá trị cho một điểm khi biết tham số t của đường thẳng, 1 điểm trên đường thẳng và vector chỉ phương</summary>
       	public PointD(Vector Normal, PointD M0, double t)
       	{
           	X = M0.X + Normal.A * t;
           	Y = M0.Y + Normal.B * t;
           	Z = M0.Z + Normal.C * t;
       	}

       	/// <summary>Nhập tọa độ từ một biến có kiểu tọa độ của AutoCAD, là mảng 3 phần tử X,Y,Z</summary>
       	public PointD(object AcadPointD)
       	{
           	try
           	{
               	double[] pts = (double[])AcadPointD;
               	X = pts[0];
               	Y = pts[1];
               	Z = pts[2];
           	}
           	catch
           	{
               	X = Y = Z = 0;
           	}            	
       	}

       	/// <summary>So sánh trùng 2 điểm</summary>
       	public static bool operator ==(PointD P1, PointD P2)
       	{
           	return (P1.X == P2.X && P1.Y == P2.Y && P1.Z == P2.Z);
       	}

       	/// <summary>So sánh không trùng 2 điểm</summary>
       	public static bool operator !=(PointD P1, PointD P2)
       	{
           	return !(P1.X == P2.X && P1.Y == P2.Y && P1.Z == P2.Z);
       	}

       	/// <summary>So sánh trùng 2 điểm</summary>
       	public override bool Equals(object obj)
       	{
           	PointD P2 = (PointD)obj;
           	return (X == P2.X && Y == P2.Y && Z == P2.Z);
       	}

       	/// <summary>Hàm băm</summary>
       	public override int GetHashCode()
       	{
           	return base.GetHashCode();
       	}

       	/// <summary>Tổng của 2 điểm</summary>
       	public static PointD operator +(PointD P1, PointD P2)
       	{
           	return new PointD(P1.X + P2.X, P1.Y + P2.Y, P1.Z + P2.Z);
       	}

       	/// <summary>Hiệu của 2 điểm</summary>
       	public static PointD operator -(PointD P1, PointD P2)
       	{
           	return new PointD(P1.X - P2.X, P1.Y - P2.Y, P1.Z - P2.Z);
       	}

       	/// <summary>Nhân một điểm với một số</summary>
       	public static PointD operator *(double K, PointD P)
       	{
           	return new PointD(K * P.X, K * P.Y, K * P.Z);
       	}

       	/// <summary>Nhân một điểm với một số</summary>
       	public static PointD operator *(PointD P,double K)
       	{
           	return new PointD(K * P.X, K * P.Y, K * P.Z);
       	}

       	/// <summary>Chia một điểm với một số</summary>
       	public static PointD operator /(PointD P, double K)
       	{
           	return new PointD(P.X / K, P.Y / K, P.Z / K);
       	}

       	/// <summary>Khoảng cách giữa 2 điểm</summary>
       	public double Distance(PointD P)
       	{
           	return System.Math.Sqrt((X - P.X) * (X - P.X) + (Y - P.Y) * (Y - P.Y) + (Z - P.Z) * (Z - P.Z));
       	}

       	/// <summary>Khoảng cách giữa nó đến một đường thẳng</summary>
       	public double Distance(Line L)
       	{
           	return L.Distance(this);
       	}

       	/// <summary>Khoảng cách giữa nó đến một mặt phẳng</summary>
       	public double Distance(Plane PL)
       	{
           	return PL.Distance(this);
       	}

       	/// <summary>Hình chiếu của nó lên một đường thẳng</summary>
       	/// Sử dụng mảng để tương thích
       	public PointD[] Project(Line L)
       	{
           	//Giao điểm G giữa đường thẳng L với đường thẳng qua điểm này và vuông góc với L
           	//G thuộc L --> xG = xL0 + At, yG = yL0 + Bt, zg = zL0 + Ct
           	//Gọi d là khoảng cách từ điểm đến đường thẳng
           	//d^2 = (xG - x0)^2 + (yG - y0)^2 + zG - z0)^2 = this.Distance(L)   		[1]
           	//Thay xG, yG, zG vào phtr [1] -->
           	//(xL0 + At - x0)^2 + (yL0 + Bt - y0)^2 + (zL0 + Ct - z0)^2 --> sau khi khai triển ta có phương trình bậc 2 ẩn t có 3 hệ số A, B, C
           	double A = L.Normal.A * L.Normal.A + L.Normal.B * L.Normal.B + L.Normal.C * L.Normal.C;
           	double B = 2 * (L.Normal.A * (L.M0.X - X) + L.Normal.B * (L.M0.Y - Y) + L.Normal.C * (L.M0.Z - Z));
           	double C = (L.M0.X - X) * (L.M0.X - X) + (L.M0.Y - Y) * (L.M0.Y - Y) + (L.M0.Z - Z) * (L.M0.Z - Z) - Distance(L);

           	Math.QuadraticEquation eq2 = new Math.QuadraticEquation(A, B, C);
           	double[] nghiem = eq2.Solve();

           	if (nghiem != null)
           	{
               	if (nghiem.Length == 1) return new PointD[] { L.GetPoint(nghiem[0]) };
               	else return new PointD[] { L.GetPoint(nghiem[0]), L.GetPoint(nghiem[1]) };
           	}

           	return null;
       	}

       	/// <summary>Hình chiếu của nó lên một mặt phẳng</summary>
       	/// Sử dụng mảng để tương thích
       	public PointD[] Project(Plane PL)
       	{
           	//đường thẳng nối điểm này và điểm hình chiếu sẽ cùng phương với cevtor chỉ phương của mặt phẳng
           	Line L = new Line(PL.Normal, this);

           	PointD[] Intersects = L.IntersectWith(PL);

           	if (Intersects != null) return Intersects;

           	return null;
       	}

       	/// <summary>Di chuyển thêm một đoạn</summary>
       	public void Move(double dX, double dY, double dZ)
       	{
           	X += dX;
           	Y += dY;
           	Z += dZ;
       	}

       	/// <summary>Di chuyển thêm một đoạn</summary>
       	public void Move(PointD delta)
       	{
           	X += delta.X;
           	Y += delta.Y;
           	Z += delta.Z;
       	}

       	/// <summary>Sao chép điểm qua một biến mới</summary>
       	public PointD Copy()
       	{
           	return new PointD(X, Y, Z);
       	}

       	/// <summary>Quay 3D một điểm quanh 1 điểm khác, tức là quay nó quanh đường thẳng vuông góc với mặt phẳng xOy
       	/// Tọa độ Z sẽ không thay đồi</summary>                	
       	public void Rotate(PointD Center, double Angle)
       	{
           	//Sử dụng công thức
           	//x' = (x - a) * cosA - (y - B) * sinA + a
           	//y' = (x - a) * sinA + (y - B) * cosA + b
           	//Với tâm quay I (a,B) và góc quay A
           	double temp_X = (X - Center.X) * System.Math.Cos(Angle) - (Y - Center.Y) * System.Math.Sin(Angle) + Center.X;
           	Y = (X - Center.X) * System.Math.Sin(Angle) - (Y - Center.Y) * System.Math.Cos(Angle) + Center.Y;
           	X = temp_X;

           	//Góc hiện tại giữa điểm này và điểm tâm
           	//double this_ang = System.Math.Atan2(Y - Center.Y, X - Center.X);

           	//this_ang += Angle;

           	//double this_radius = System.Math.Sqrt((X - Center.X) * (X - Center.X) + (Y - Center.Y) * (Y - Center.Y) + (Z - Center.Z) * (Z - Center.Z));
           	//X = Center.X + this_radius * System.Math.Cos(this_ang);
           	//Y = Center.Y + this_radius * System.Math.Sin(this_ang);
       	}

       	/// <summary>Quay 3D một điểm quanh đường thẳng qua 2 điểm</summary>
       	public void Rotate(PointD P1, PointD P2, double Angle)
       	{
           	Rotate(new Line(P1, P2), Angle);
       	}

       	/// <summary>Quay 3D một điểm quanh 1 đường thẳng</summary>
       	public void Rotate(Line L, double Angle)
       	{
           	//Trình tự tạm thời như sau:
           	// 1. Tìm điểm tâm quay nằm trên đường thẳng
           	// 2. Trải phẳng điểm này tương đối so với tâm quay đã chuyển về (0,0)
           	// 3. Quay phẳng nó trong mp xOy
           	// 4. Chiếu M trở lại mp vòng tròn quay ban đầu
           	// 5. Dời theo điểm quay để lấy lại tọa độ cũ

           	// 1. Tìm điểm tâm quay nằm trên đường thẳng
           	PointD[] centers = Project(L);

           	// 2. Trải phẳng điểm này tương đối so với tâm quay đã chuyển về (0,0)
           	PointD M = new PointD(this - centers[0]);
           	M = M.To2DPoint();

           	// 3. Quay phẳng nó trong mp xOy
           	M.Rotate(new PointD(0, 0, 0), Angle);

           	// 4. Chiếu M trở lại mp vòng tròn quay ban đầu
           	Plane PL = new Plane(L.Normal, centers[0]);
           	PointD[] Mps = M.Project(PL);

           	// 5. Dời theo điểm quay để lấy lại tọa độ cũ
           	Mps[0] += centers[0];

           	X = Mps[0].X;
           	Y = Mps[0].Y;
           	Z = Mps[0].Z;
       	}

       	/// <summary>Đối xứng trong không gian qua 1 đường thẳng, tức là đối xứng qua mặt phẳng chứa đường thẳng 
       	/// và có vector pháp tuyến đi qua điểm này và điểm hình chiếu của nó trên đường thẳng</summary>
       	public PointD Mirror(double X1, double Y1, double Z1, double X2, double Y2, double Z2)
       	{
           	return Mirror(new Line(new PointD(X1, Y1, Z1), new PointD(X2, Y2, Z2)));
       	}

       	/// <summary>Đối xứng trong không gian qua 1 đường thẳng, tức là đối xứng qua mặt phẳng chứa đường thẳng 
       	/// và có vector pháp tuyến đi qua điểm này và điểm hình chiếu của nó trên đường thẳng</summary>
       	public PointD Mirror(PointD P1, PointD P2)
       	{
           	return Mirror(new Line(P1, P2));
       	}

       	/// <summary>Đối xứng trong không gian qua 1 đường thẳng, tức là đối xứng qua mặt phẳng chứa đường thẳng 
       	/// và có vector pháp tuyến đi qua điểm này và điểm hình chiếu của nó trên đường thẳng</summary>
       	public PointD Mirror(Line L)
       	{
           	try
           	{
               	//Hình chiếu của nó trên đường thẳng
               	PointD[] ProjectPointD = Project(L);
               	//Độ lệch giữa chúng
               	PointD delta = ProjectPointD[0] - this;
               	//Di chuyển đến vị trí mới
               	ProjectPointD[0].Move(delta);

               	return ProjectPointD[0];
           	}
           	catch { };

           	return null;
       	}

       	/// <summary>Đối xứng trong không gian qua mặt phẳng</summary>
       	public PointD Mirror(PointD P1, PointD P2, PointD P3)
       	{
           	return Mirror(new Plane(P1, P2, P3));
       	}

       	/// <summary>Đối xứng trong không gian qua mặt phẳng</summary>
       	public PointD Mirror(Plane PL)
       	{
           	try
           	{
               	//Hình chiếu của nó trên mặt phẳng
               	PointD[] ProjectPointD = Project(PL);
               	//Độ lệch giữa chúng
               	PointD delta = ProjectPointD[0] - this;
               	//Di chuyển đến vị trí mới
               	ProjectPointD[0].Move(delta);

               	return ProjectPointD[0];
           	}
           	catch { };

           	return null;
       	}

       	/// <summary>Chuyển thành kiểu dữ liệu PointF của Windows</summary>
       	public System.Drawing.PointF ToPointF()
       	{
           	return new System.Drawing.PointF((float)X, (float)Y);
       	}

       	/// <summary>Chuyển thành điểm phẳng, là phép khử Z</summary>
       	public PointD To2DPoint()
       	{
           	//Hình chiếu của M trên mp xOy là Mz, góc giữa OMz và Ox là
           	double a1 = System.Math.Atan2(Y, X);
           	//Khoảng cách từ M --> O
           	double radius = System.Math.Sqrt(X * X + Y * Y + Z * Z);
           	//Tọa độ M' khi quay M đến mp xOy là

           	return new PointD(radius * System.Math.Cos(a1), radius * System.Math.Sin(a1), 0);
       	}

       	/// <summary>Xuất tọa độ thành chuỗi có dạng (X, Y, Z)</summary>
       	public override string ToString()
       	{
           	return "(" + X + ", " + Y + ", " + Z + ")";
       	}

       	/// <summary>Xuất tọa độ thành chuỗi có dạng (X.digit, Y.digit, Z.digit)</summary>
       	public string ToString(int Digit)
       	{
           	return "(" + System.Math.Round(X, Digit) + ", " + System.Math.Round(Y, Digit) + ", " + System.Math.Round(Z, Digit) + ")"; 
       	}
   	}

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Cái này thực hiện bắt điểm và vẽ trên cad thì không vấn đề gì nhưng nếu là lập trình lisp hoặc VBA thì lại là cả một vất đề lớn như Bác anhcos đã đề câpk ở trên.

@ Anh Phamngoctukts: Ồ,..Sao anh không trả lời thẳng vào câu hỏi của em???

Tình hình là để vẽ một đường thẳng từ một điểm cho trước vuông góc với một đường Line bất kỳ trong không gian, không cần thiết phải gắn hệ trục toạ độ để vẽ như em đã nói ở bài viết trên đâu nhé!

- Chỉ cần gõ L bắt điểm cần vẽ >> tiếp theo nhấn Shift + Chuột phải >> chọn chế độ bắt điểm Perpendicular là bắt điểm vuông góc được ngon lành. Điểm vuông có thể nằm trên đoạn thẳng hoặc nằm ngoài đoạn thẳng (Kéo dài đoạn thẳng sẽ gặp điểm vuông góc).

Theo em thì không cần thiết phải dùng lisp, đỡ hao tổn nơtron!

 

- Nếu tất cả các điểm của đường Pline đồng phẳng, việc bắt điểm cũng ngon lành lắm ứ!

Trong thực tế không vẽ được đường Pline mà các điểm của nó không đồng phẳng

 

- Nếu tất cả các đường Spline đồng phẳng hoặc không đồng phẳng, có thể có đường vuông góc, có thể không có.

 

Dưới đây là hình minh hoạ đường Spline có các điểm không đồng phẳng nằm trong khối hộp chữ nhật và một điểm là tâm đường tròn. Em rất thèm bắt điểm vuông góc mà chịu chết, không bắt được:

 

vg111.jpg

 

Xem file bản vẽ.

http://www.cadviet.com/upfiles/3/ve_vgoc.dwg

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Em xin đính chính bài viết trên có câu em đã trót dại, viết sai cơ bản:"Trong thực tế không vẽ được đường Pline mà các điểm của nó không đồng phẳng" Vì lý do sau:

 

Dùng lệnh: _3dpoly ;là vẽ được pl có đỉnh ko đồng phẳng.

Em xin được cảm ơn bác Duy một lần nữa!

(Kể ra viết bài kiểu Spam như thế này cũng vui!)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

cám ơn bạn anhcos nhiều nhé. mình sẽ tham khảo code của bạn và cố gắng hiểu thuật toán vì mình không rành về c#. cám ơn bạn rất nhiều!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Em có:

- Đường thẳng d1 đi qua hai điểm A (25,0,50) và B(25,50,0)

- Đường thẳng d2 đi qua hai điểm C(0,25,0) và D(25,50,50)

Em đang loay hoay tìm cách vẽ đường vuông góc chung của hai đường thẳng này trên CAD nhưng chưa được nhờ các bác giúp đỡ, em xin cảm ơn nhiều!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Em có:

- Đường thẳng d1 đi qua hai điểm A (25,0,50) và B(25,50,0)

- Đường thẳng d2 đi qua hai điểm C(0,25,0) và D(25,50,50)

Em đang loay hoay tìm cách vẽ đường vuông góc chung của hai đường thẳng này trên CAD nhưng chưa được nhờ các bác giúp đỡ, em xin cảm ơn nhiều!

Em thì không biết gì về VBA, nhưng mà có vô số đường vuông góc chung với 2 đường này. Bởi vì đường vuông góc ấy chính là giao tuyến của hai mặt phẳng, mỗi mặt phẳng trong đó lấy lần lượt d1 d2 làm pháp tuyến.

Mặt phẳng vuông góc với d1 có phương trình là :

0x+50y-50z+D1=0

Mặt phẳng vuông góc với d2 có phương trình là:

25x+25y+50z+D2=0

Đường thẳng cần tìm có phương trình là:

0x+50y-50z+D1=0 và 25x+25y+25z+D2=0. Từ đây có thể dựng nó qua 2 điểm tìm được từ phương trình trên!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

1. Bạn hỏi cái này trong VBA, vậy liệu có phải là nhầm chủ đề rồi không?

2. Nếu bình thuờng thì cứ bắt điểm vuông góc (per) thôi.

 

Đoạn này người ta hỏi về VBA, bạn lấy CAD ra trả lời.

 

Em thì không biết gì về VBA, nhưng mà có vô số đường vuông góc chung với 2 đường này. Bởi vì đường vuông góc ấy chính là giao tuyến của hai mặt phẳng, mỗi mặt phẳng trong đó lấy lần lượt d1 d2 làm pháp tuyến.

Mặt phẳng vuông góc với d1 có phương trình là :

0x+50y-50z+D1=0

Mặt phẳng vuông góc với d2 có phương trình là:

25x+25y+50z+D2=0

Đường thẳng cần tìm có phương trình là:

0x+50y-50z+D1=0 và 25x+25y+25z+D2=0. Từ đây có thể dựng nó qua 2 điểm tìm được từ phương trình trên!

 

Đoạn này hỏi về CAD, bạn lại đem cái khác ra.

2 phương trình 3 ẩn x,y,z nói chung là khó giải lắm.

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Em thì không biết gì về VBA, nhưng mà có vô số đường vuông góc chung với 2 đường này. Bởi vì đường vuông góc ấy chính là giao tuyến của hai mặt phẳng, mỗi mặt phẳng trong đó lấy lần lượt d1 d2 làm pháp tuyến.

Đây là 2 đường thẳng chéo nhau chỉ có 1 đường vuông góc chung duy nhất làm gì mà có vô số đường hả bạn. Bài toán này giải theo cách cổ điển là được mà.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Em thì không biết gì về VBA, nhưng mà có vô số đường vuông góc chung với 2 đường này. Bởi vì đường vuông góc ấy chính là giao tuyến của hai mặt phẳng, mỗi mặt phẳng trong đó lấy lần lượt d1 d2 làm pháp tuyến.

Mặt phẳng vuông góc với d1 có phương trình là :

0x+50y-50z+D1=0

Mặt phẳng vuông góc với d2 có phương trình là:

25x+25y+50z+D2=0

Đường thẳng cần tìm có phương trình là:

0x+50y-50z+D1=0 và 25x+25y+25z+D2=0. Từ đây có thể dựng nó qua 2 điểm tìm được từ phương trình trên!

:rolleyes: :rolleyes: :rolleyes: Anh Pdle vui tính đáo để!

Kết luận của anh Pdle là có vô số đường vuông góc chung là sai cơ bản!

Lần đầu tiên trong đời em dòm thấy cái phương trình của anh Pdle đẹp như thế!

Em đang loay hoay vẽ trên CAD chưa được.

Về thuật toán:

-Đường thẳng d1 có véc tơ chỉ phương V1, đường thẳng d2 có véc tơ chỉ phương V2. Tích vô hướng của hai véc tơ v1 và v2 là véc tơ V3.

- V3 là véc tơ chỉ phương của đường thẳng vuông góc chung.

- Dựng mặt phẳng P chứa đường thẳng d1 và song song với véc tơ V3

===> Giao điểm của đường thẳng d2 với mặt phẳng P chính là chân đường vuông góc cần tìm trên đường d2

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Đoạn này người ta hỏi về VBA, bạn lấy CAD ra trả lời.

Đoạn này em đã nói trước, liệu có phải là nhầm chủ đề không? vì dạo này trên 4rum thi thoảng có vài người post bài nhầm chủ đề,nên em đã hỏi trước. Nếu hỏi không đúng trong chủ đề VBA thì câu trả lời em đưa ra chắc là có ích, còn nếu đúng chủ đề thì coi như em chưa giúp được bạn đó thôi!

 

Đoạn này hỏi về CAD, bạn lại đem cái khác ra.

2 phương trình 3 ẩn x,y,z nói chung là khó giải lắm.

Em nghĩ cái mà em đưa ra hoàn toàn có thể dùng để tìm lời giải (thuật toán giải ) cho vấn đề này! Mời anh xem giải thích của em ở phía dưới.

 

Đây là 2 đường thẳng chéo nhau chỉ có 1 đường vuông góc chung duy nhất làm gì mà có vô số đường hả bạn. Bài toán này giải theo cách cổ điển là được mà.

 

Có vô số đường anh ạ. Chỉ có một vecto vuông góc với 2 đường thẳng chéo nhau. Nhưng bởi vì đường thẳng được xác định bởi một vecto chỉ phương và 1 điểm nằm trên nó, nên ta có thể vẽ vô số đường thẳng vuông góc với 2 đường thẳng chéo nhau đó! (1 vecto chỉ phương cố định và vô số điểm gốc)

 

:rolleyes: :rolleyes: :rolleyes: Anh Pdle vui tính đáo để!

Kết luận của anh Pdle là có vô số đường vuông góc chung là sai cơ bản!

Lần đầu tiên trong đời em dòm thấy cái phương trình của anh Pdle đẹp như thế!

Em đang loay hoay vẽ trên CAD chưa được.

Về thuật toán:

-Đường thẳng d1 có véc tơ chỉ phương V1, đường thẳng d2 có véc tơ chỉ phương V2. Tích vô hướng của hai véc tơ v1 và v2 là véc tơ V3.

- V3 là véc tơ chỉ phương của đường thẳng vuông góc chung.

- Dựng mặt phẳng P chứa đường thẳng d1 và song song với véc tơ V3

===> Giao điểm của đường thẳng d2 với mặt phẳng P chính là chân đường vuông góc cần tìm trên đường d2

Kết luận của em sẽ sai cơ bản nếu anh cần dựng một vecto vuông góc với 2 đường thẳng đó (vecto và đường thẳng là hai khái niệm khác nhau)

Để xác định tính duy nhất của đường thẳng cần dựng, anh cần phải cho thêm dữ liệu là một điểm cho trước mà nó phải đi qua.

Mời mọi người xem cái này:

1-22.jpg

2-16.jpg

 

Còn đây là ít nhất 3 đường thẳng song song với d1 và d2 của anh:http://www.cadviet.com/upfiles/3/test_11.dwg

 

Để tìm đường thẳng vuông góc với d1 và d2, em nghĩ không khó anh ạ:

 

1. Dễ thấy vecto (-3,1,1) vuông góc với vecto chỉ phương của d1 và d2

 

2. Cho tọa độ một điểm M (a,b,c)

 

3. Đường thẳng cần tìm đi qua M và N có tọa độ (a-3m,b+m,c+m)

 

Với d1 và d2 bất kỳ cũng tương tự!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Em thì không biết gì về VBA, nhưng mà có vô số đường vuông góc chung với 2 đường này. Bởi vì đường vuông góc ấy chính là giao tuyến của hai mặt phẳng, mỗi mặt phẳng trong đó lấy lần lượt d1 d2 làm pháp tuyến.

Mặt phẳng vuông góc với d1 có phương trình là :

0x+50y-50z+D1=0

Mặt phẳng vuông góc với d2 có phương trình là:

25x+25y+50z+D2=0

Đường thẳng cần tìm có phương trình là:

0x+50y-50z+D1=0 và 25x+25y+25z+D2=0. Từ đây có thể dựng nó qua 2 điểm tìm được từ phương trình trên!

Định lí : Hai đường thẳng chéo nhau có một và chỉ một đoạn vuông góc chung.

Tiên đề 1 : Qua 2 điểm phân biệt chỉ có một và chỉ một đường thẳng mà thôi

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Định lí : Hai đường thẳng chéo nhau có một và chỉ một đoạn vuông góc chung.

Tiên đề 1 : Qua 2 điểm phân biệt chỉ có một và chỉ một đường thẳng mà thôi

Reply này của anh Tue_NV làm em tỉnh hết cả người! Bây giờ em mới nhớ ra, đường vuông góc chung của 2 đường thẳng phải đi qua 2 đường thẳng đó.

Thành thật xin lỗi tất cả mọi người!

 

Trở lại vấn đề, nếu anh hoan2182 muốn vẽ chỉ bằng các thao tác trên CAD thì em không có ý kiến gì, nhưng nếu anh ấy cần một lời giải bằng giải tích thì em có như thế này ạ:

Đường thẳng d1 đi qua 2 điểm A(25,0,50) và B(25,50,0); như vậy phương trình của nó là : x=25, y=t, z=50-t

Đường thẳng thứ hai đi qua C(0,25,0) và D(25,50,50); phương trình của nó là: x1=t1, y1=25+t1, z=2t1

Đường vuông góc chung có vecto chỉ phương (-3,1,1). Như vậy ta có:

x1=-3m+x, y1=m+y, z1=m+z

Hay là: t1=-3m+25, 25+t1=m+t, 2t1=m+50-t. Từ đây:

75=2t+t1 và 50=3t-4t1.

Nghĩa là:t=350/11 và t1=125/11. Từ đây ta có, đường thẳng cần tìm đi qua điểm (25,350/11,50-350/11) và (125/11,25+125/11,250/11)

 

Bằng cách này có thể tìm lời giải cho bài toán tổng quát, nhưng khách quan mà nói, lời giải này không đẹp!

 

Một lần nữa em xin lỗi cả nhà!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Em có:

- Đường thẳng d1 đi qua hai điểm A (25,0,50) và B(25,50,0)

- Đường thẳng d2 đi qua hai điểm C(0,25,0) và D(25,50,50)

Em đang loay hoay tìm cách vẽ đường vuông góc chung của hai đường thẳng này trên CAD nhưng chưa được nhờ các bác giúp đỡ, em xin cảm ơn nhiều!

Mình có cách này bạn than khảo nhé. Copy d2 cắt d1 (bắt điểm nearest) gọi là d1'. Dựng hình bình hành ABCD từ các đỉnh của d1 d1'. Extrude hình bình hành này với chiều cao là bắt điểm trên d2. Nối đỉnh A' C' trên của hình bình hành đã extrude cắt d2 tại o. Từ o vẽ đường vuông góc với d1 ta được đường vuông góc chung. Do mình dùng điện thoại nên không có hình minh hoạ được bạn thông cảm nhé.

BS: Vừa có mạng mình tranh thủ up ảnh lên cho bạn xem

ddddddd.jpg

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Reply này của anh Tue_NV làm em tỉnh hết cả người! Bây giờ em mới nhớ ra, đường vuông góc chung của 2 đường thẳng phải đi qua 2 đường thẳng đó.

Thành thật xin lỗi tất cả mọi người!

 

Trở lại vấn đề, nếu anh hoan2182 muốn vẽ chỉ bằng các thao tác trên CAD thì em không có ý kiến gì, nhưng nếu anh ấy cần một lời giải bằng giải tích thì em có như thế này ạ:

Đường thẳng d1 đi qua 2 điểm A(25,0,50) và B(25,50,0); như vậy phương trình của nó là : x=25, y=t, z=50-t

Đường thẳng thứ hai đi qua C(0,25,0) và D(25,50,50); phương trình của nó là: x1=t1, y1=25+t1, z=2t1

Đường vuông góc chung có vecto chỉ phương (-3,1,1). Như vậy ta có:

x1=-3m+x, y1=m+y, z1=m+z

Hay là: t1=-3m+25, 25+t1=m+t, 2t1=m+50-t. Từ đây:

75=2t+t1 và 50=3t-4t1.

Nghĩa là:t=350/11 và t1=125/11. Từ đây ta có, đường thẳng cần tìm đi qua điểm (25,350/11,50-350/11) và (125/11,25+125/11,250/11)

 

Bằng cách này có thể tìm lời giải cho bài toán tổng quát, nhưng khách quan mà nói, lời giải này không đẹp!

 

Một lần nữa em xin lỗi cả nhà!

Kết quả tính toán của anh Pdle chắc chắn là sai:

Nghĩa là:t=350/11 và t1=125/11. Từ đây ta có, đường thẳng cần tìm đi qua điểm (25,350/11,50-350/11) và (125/11,25+125/11,250/11) ???

Cảm ơn anh! Anh xem lại nhé!

 

@anh phamngoctukts : Em bận chưa làm thử theo cách của anh, cảm ơn anh nhiều

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Kết quả tính toán của anh Pdle chắc chắn là sai:

Nghĩa là:t=350/11 và t1=125/11. Từ đây ta có, đường thẳng cần tìm đi qua điểm (25,350/11,50-350/11) và (125/11,25+125/11,250/11) ???

Cảm ơn anh! Anh xem lại nhé!

Em kiểm tra lại rồi anh ạ, không sai được, vì:

Điểm (25,350/11,50-350/11) nằm trên đường thẳng qua A và B: x=25, y=350/11, z= 50-350/11 (với t=350/11)

Điểm (125/11,25+125/11,250/11) nằm trên đường thẳng qua C và D: x=125/11, y=25+125/11, z=2*125/11 (với t1=125/11)

Ngoài ra hai điểm đó nằm trên đường thẳng có vecto chỉ phương là (125/11-25,25+125/11-350/11,250/11-50+350/11) = (-150/11,50/11,50/11) tức là vecto(-150,50,50) hay (-3,1,1). Vecto này vuông góc với vecto chỉ phương của d1 và d2

Từ đây ta có đường thẳng cần tìm phải đi qua 2 điểm trên:

 

1-23.jpg

 

P/s: Cách này thì không có gì đẹp cả :(. Chỉ tính toán thôi ạ :D

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

@ anh phamngoctukts : Hình như anh vẽ trường hợp hai đường thẳng chéo nhau nằm trên hai mặt phẳng song song với nhau. Trường hợp của em chỉ có là 2 đường thẳng nằm trên hai mặt phẳng chéo nhau, nên áp dụng cách của anh gặp khó khăn…em sẽ ngâm cứu tiếp theo hướng này.

@anh Pdle

Quả thực là ban đầu em thấy anh nói hai đường thẳng chéo nhau có vô số đường vuông góc chung nên em không tin vào kết quả tính của anh.

Thú thực là em rất ngại tính toán, khi vẽ em tìm cách phải né tránh việc phải nhập giá trị kích thước vào dòng lệnh, không tìm ra cách thì đành phải nhập kích thước thôi. Bởi vì nhập số kích thước gõ hay bị nhầm lẫn.

Em vừa thử vẽ, kết quả đúng, chính xác!

 

Command: l LINE Specify first point: 11.36,36.36,22.73

Specify next point or [undo]: 25,31.82,18.18

 

Rất cảm ơn hai anh đã quan tâm!

 

hrey.jpg

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

@anh Pdle

Quả thực là ban đầu em thấy anh nói hai đường thẳng chéo nhau có vô số đường vuông góc chung nên em không tin vào kết quả tính của anh.

Thú thực là em rất ngại tính toán, khi vẽ em tìm cách phải né tránh việc phải nhập giá trị kích thước vào dòng lệnh, không tìm ra cách thì đành phải nhập kích thước thôi. Bởi vì nhập số kích thước gõ hay bị nhầm lẫn.

Em vừa thử vẽ, kết quả đúng, chính xác!

 

Command: l LINE Specify first point: 11.36,36.36,22.73

Specify next point or [undo]: 25,31.82,18.18

 

Em thấy anh hoan2182 hỏi trong mục VBA, nên đoán là liên quan đến lập trình gì đấy. Em không biết về VBA nhưng theo em thấy khi viết cho máy tự động làm việc thì em thấy phương pháp số là khá hữu hiệu.

 

Chúc anh sẽ tìm ra một thuật toán hay và hiệu quả cho bài toán này!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay
Đăng nhập để thực hiện theo  

×