Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
28 replies to this topic

#1 redsea_tq

redsea_tq

    biết lệnh erase

  • Members
  • PipPipPip
  • 107 Bài viết
Điểm đánh giá: 13 (tàm tạm)

Đã gửi 29 May 2011 - 06:09 PM

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?
  • 0

#2 pdle

pdle

    biết lệnh mtext

  • Members
  • PipPipPipPip
  • 286 Bài viết
Điểm đánh giá: 124 (tàm tạm)

Đã gửi 29 May 2011 - 06:32 PM

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.
  • 0
Share your knowledge. It is a way to achieve immortality !

***

PS: Nếu bài viết của mình có ích, xin hãy "Bình chọn cho bài viết này" nhé :D

#3 anhcos

anhcos

    biết lệnh hatchedit

  • Advance Member
  • PipPipPipPip
  • 260 Bài viết
Điểm đánh giá: 170 (tàm tạm)

Đã gửi 29 May 2011 - 10:03 PM

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
  • 0
Clear sky!

MF Rock collection.

#4 phamngoctukts

phamngoctukts

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1107 Bài viết
Điểm đánh giá: 696 (tốt)

Đã gửi 30 May 2011 - 12:19 AM

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

  • 1
Tất cả vì sự phát triển của diễn đàn ...
Cám ơn đừng nói lời suông mà hãy nhấn Hình đã gửi!

#5 hoan2182

hoan2182

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 2646 Bài viết
Điểm đánh giá: 832 (rất tốt)

Đã gửi 30 May 2011 - 07:10 AM

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???
  • 0

Gió đưa cây cải về trời

Rau răm ở lại chịu lời đắng cay...


#6 phamngoctukts

phamngoctukts

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1107 Bài viết
Điểm đánh giá: 696 (tốt)

Đã gửi 30 May 2011 - 07:22 AM

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.
  • 1
Tất cả vì sự phát triển của diễn đàn ...
Cám ơn đừng nói lời suông mà hãy nhấn Hình đã gửi!

#7 redsea_tq

redsea_tq

    biết lệnh erase

  • Members
  • PipPipPip
  • 107 Bài viết
Điểm đánh giá: 13 (tàm tạm)

Đã gửi 30 May 2011 - 07:29 AM

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!
  • 0

#8 anhcos

anhcos

    biết lệnh hatchedit

  • Advance Member
  • PipPipPipPip
  • 260 Bài viết
Điểm đánh giá: 170 (tàm tạm)

Đã gửi 30 May 2011 - 09:27 AM

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) + ")";
}
}

  • 1
Clear sky!

MF Rock collection.

#9 hoan2182

hoan2182

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 2646 Bài viết
Điểm đánh giá: 832 (rất tốt)

Đã gửi 30 May 2011 - 09:51 AM

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:

Hình đã gửi

Xem file bản vẽ.
http://www.cadviet.c...s/3/ve_vgoc.dwg
  • 0

Gió đưa cây cải về trời

Rau răm ở lại chịu lời đắng cay...


#10 hoan2182

hoan2182

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 2646 Bài viết
Điểm đánh giá: 832 (rất tốt)

Đã gửi 30 May 2011 - 11:22 AM

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!)
  • 0

Gió đưa cây cải về trời

Rau răm ở lại chịu lời đắng cay...


#11 redsea_tq

redsea_tq

    biết lệnh erase

  • Members
  • PipPipPip
  • 107 Bài viết
Điểm đánh giá: 13 (tàm tạm)

Đã gửi 30 May 2011 - 08:16 PM

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!
  • 0

#12 hoan2182

hoan2182

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 2646 Bài viết
Điểm đánh giá: 832 (rất tốt)

Đã gửi 31 May 2011 - 06:34 PM

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!
  • 0

Gió đưa cây cải về trời

Rau răm ở lại chịu lời đắng cay...


#13 pdle

pdle

    biết lệnh mtext

  • Members
  • PipPipPipPip
  • 286 Bài viết
Điểm đánh giá: 124 (tàm tạm)

Đã gửi 31 May 2011 - 08:33 PM

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!
  • 0
Share your knowledge. It is a way to achieve immortality !

***

PS: Nếu bài viết của mình có ích, xin hãy "Bình chọn cho bài viết này" nhé :D

#14 anhcos

anhcos

    biết lệnh hatchedit

  • Advance Member
  • PipPipPipPip
  • 260 Bài viết
Điểm đánh giá: 170 (tàm tạm)

Đã gửi 31 May 2011 - 10:13 PM

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.
  • 1
Clear sky!

MF Rock collection.

#15 phamngoctukts

phamngoctukts

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1107 Bài viết
Điểm đánh giá: 696 (tốt)

Đã gửi 31 May 2011 - 10:26 PM

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à.
  • 0
Tất cả vì sự phát triển của diễn đàn ...
Cám ơn đừng nói lời suông mà hãy nhấn Hình đã gửi!

#16 hoan2182

hoan2182

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 2646 Bài viết
Điểm đánh giá: 832 (rất tốt)

Đã gửi 31 May 2011 - 10:46 PM

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
  • 1

Gió đưa cây cải về trời

Rau răm ở lại chịu lời đắng cay...


#17 ustoichivost

ustoichivost

    biết vẽ circle

  • Members
  • PipPip
  • 33 Bài viết
Điểm đánh giá: 6 (bình thường)

Đã gửi 01 June 2011 - 05:04 AM

có vẻ như là không có nhiều đường thẳng được!
  • 0

#18 pdle

pdle

    biết lệnh mtext

  • Members
  • PipPipPipPip
  • 286 Bài viết
Điểm đánh giá: 124 (tàm tạm)

Đã gửi 01 June 2011 - 05:07 AM

Đ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:
Hình đã gửi
Hình đã gửi

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ự!
  • 0
Share your knowledge. It is a way to achieve immortality !

***

PS: Nếu bài viết của mình có ích, xin hãy "Bình chọn cho bài viết này" nhé :D

#19 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 01 June 2011 - 06:22 AM

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
  • 1

#20 pdle

pdle

    biết lệnh mtext

  • Members
  • PipPipPipPip
  • 286 Bài viết
Điểm đánh giá: 124 (tàm tạm)

Đã gửi 01 June 2011 - 06:53 AM

Đị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à!
  • 0
Share your knowledge. It is a way to achieve immortality !

***

PS: Nếu bài viết của mình có ích, xin hãy "Bình chọn cho bài viết này" nhé :D