CÁC THIẾT BỊ ĐỒ HỌA 3
CÁC THIẾT BỊ ĐỒ HỌA
1/ MỘT SỐ THIẾT BỊ ĐỒ HỌA THÔNG DỤNG a/ Thiết bị quét Raster :
Thiết bị quét Raster (gọi tắt là Raster) cũng là một loại thiết bị thể hiện (màn hình) chính Thiết bị Raster thể hiện hình ảnh từ những điểm màu thay vì đường Mỗi điểm còn gọi là pixel.
Giới thiệu một số thiết bị Raster :
Màn hình hiển thị trong hệ thống đồ họa máy tính là cầu nối chính trong việc trao đổi thông tin giữa người sử dụng và hệ thống Có nhiều loại công nghệ được sử dụng để phối hợp các loại màn hình đồ họa. Độ phân giải liên quan đến khả năng màn hình thể hiện các chi tiết Các màn hình đạt đến độ phân giải 1280x1024, ở đây các con số thể hiện các điểm có thể phân biệt trên màn hình.
SVTH:Trần Hoài Nam Niên khóa 1997-20025
CRT màu Màn hình phẳng Ống nhớ CRT làm tươi Đơn sắc Màu
Hình: Các công nghệ sử dụng trong cấu tạo thiết bị hiển thị đồ họa
Các ký tự văn bản được hình thành từ các mẫu điểm Đường thẳng và cung được hình thành từ một dãy các điểm thích hợp Và một vùng màn hình có thể được tô màu ; đơn giản là tất cả các điểm trong vùng được lập cùng một màu. Ảnh Raster được đặt trong một vùng nhớ gọi là vùng đệm khung (frame buffer). Thuật ngữ frame để chỉ một ảnh đơn Trong một vùng đệm khung, với trường hợp hai cấp thì chỉ cần một bit cho một điểm, khi giá trị của bit là 0, thì điểm tương ứng của ảnh có màu trắng, còn nếu là 1 thì điểm tương ứng có màu đen Với ảnh màu, để biểu diễn mỗ điểm cần nhiều bit hơn.
Vùng đệm khung chiếm rất nhiều bộ nhớ: giả sử kích thước hình là r dòng, c cột và cần b bit cho một điểm, thì cần r*c*b bit Một thiết bị Raster chất lượng cao có thể có r24, c24, b$, như thế cần 25 triệu bit (3MB) Như thế vùng đệm này nằm ở đậu và làm sao truy cập được chúng.
Với một số hệ Raster, vùng đệm khung thực sự là một phần bộ nhớ của máy. Chúng được gọi là thiết bit-maped : bộ xử lý có thể truy xuất từng điểm, và có một mạch logic riêng để làm tươi màn hình Để tạo ảnh ứng dụng sẽ ghi màu (là giá trị) trực tiếp lên vị trí bộ nhớ thích hợp Tại cấp thấp nhất, sẽ có những chỉ thị máy làm việc này Tuy nhiên để tiện lợi người ta tạo thủ tục SetPixel(row,col,A) để nạp giá trị A cho điểm tại (row,col).
Cơ cấu in của máy in ma trận điểm là tập hợp từ 7 đến 24 cây kim cứng sắp xếp trên đầu in, di chuyển theo phương nằm ngang trên mặt tờ giấy Các máy in này làm việc như thiết bị quét dòng và cần có sự chuyển đổi cho các hình ảnh dạng quét vector Việc in màu thực hiện nhờ sử dụng ruyban màu Các màu bổ sung được tạo ra bằng cách gõ hai vùng đệm trên ruyban lên cùng một điểm trên giấy.
Cũng là thiết bị quét dòng (raster scan), nó là thiết bị in màu rẻ tiền Cơ cấu của nó gồm các đầu vòi mực gắn ở đầu in, di chuyển trên bề mắt tờ giấy và phun mực với màu sắc khác nhau Các vòi phun được gắn với các hốc mực bằng các rãnh rất nhỏ bao bọc bởi các tinh thể áp điện Một xung điện đặt vào tinh thể sẽ tạo ra một cái giật nhẹ, làm bắn ra một giọt mực Độ phân giải của máy in này được quy định bởi kích thước giọt mực, hay là kích thước vòi phun tạo ra nó Vòi phun thường rất nhỏ nên khi in thường gặp một số vấn đề phức tạp.
Là thiết bị quét dòng (raster scan), trong đó chùm tia lazer quét lên một cái trống quay được tích điện dương, phủ bằng một lớp selen Phần mặt trống bị chiếu bởi chùm tia lazer sẽ bị mất điện tích dương Những phần tích điện còn lại tương ứng với những phần đen trên giấy Một lớp bột tĩnh điện phủ lên các phần tích điện dương và được truyền sang giấy Một bộ vi xử lý trên máy in lazer sẽ thực hiện chuyển đổi sang dạng quét dòng.
Là thiết bị nạp điện tích âm cho các phần của loại giấy được chế tạo đặc biệt, sau đó làm cô đặc bột tĩnh điện dạng lỏng, tích điện dương lên tờ giấy Bột tĩnh điện sẽ phủ lên và làm tối phần giấy tích điện âm Đây là thiết bị dạng quét dòng, chứa bộ xử lý để thực hiện việc chuyển đổi. b/ Thiết bị vẽ đường :
Có hai dạng thường gặp nhất của máy vẽ là dạng phẳng và dạng trống.
Máy vẽ dạng phẳng truy cập đến các vị trí xy trên mặt phẳng bằng cách chuyển động cần vẽ gắn trên bàn vẽ Trên cần vẽ có gắn một cây viết vẽ có thể chuyển động dọc theo trục x và trục y Cây viết có thể hạ xuống hay nhấc lên, tùy theo việc đường nét hay thay đổi vị trí cây viết Tờ giấy được giữ trên bàn vẽ bằng tĩnh điện hoặc chân không. -Máy vẽ dạng trống:
Máy vẽ dạng trống có một vài điểm phức tạp hơn dạng phẳng, mặc dù các chế độ hoạt động cơ bản là tương tự nhau Trong máy vẽ dạng trống, tờ giấy được cuốn lên trống vẽ sao cho không có sự trượt Trống sẽ quay tới, quay lui, trong khi đầu vẽ trượt trên một cần vẽ cố định, truy cập đến các điểm trên tờ giấy.
Các thiết bị vẽ đường (Line Drawing) chỉ có thể vẽ đường Thông dụng nhất là bút vẽ Plotter Khi plotter vẽ đường, trước hết bút được di chuyển đến điểm đầu, đặt bút xuống, sau đó bút di chuyển theo đường thẳng tới đầu kia của đường.
Các thiết bị vẽ đường có hệ tọa độ định sẵn cho bút vẽ, như trong hình dưới đây :
Bút vẽ được chỉ đến một điểm cụ thể bằng cách gửi cho Plotter tọa độ của điểm Thiết bị vẽ đường có sẵn một số thủ tục cơ bản, ví dụ một số lệnh cho bút vẽ như :
Go_To (x,y) : di chuyển bút đến điểm (x,y)
Get_Pen (i) : đổi bút hiện tại thành bút thứ i.
Những lệnh trên gọi là lệnh thiết lập chế độ (mode setting) Khi thiết bị nhận được lệnh chúng sẽ thay đổi “trạng thái” máy cho đến khi có lệnh thiết lập chế độ khác. Thiết bị phải được gửi giá trị (x,y) theo hệ tọa độ của nó, gọi là tọa độ thiết bị.
2/ GIỚI THIỆU BÀN VẼ TRONG LUẬN VĂN x y
Máy vẽ được thiết kế trong luận văn này là máy vẽ được điều khiển theo chương trình số.
Phần chính của máy vẽ gồm hai trục X,Y để điều khiển vị trí qua lại của bút vẽ trong mặt phẳng bản vẽ và trục Z gắn trực tiếp với bút vẽ để điều khiển nhấc bút lên hay hạ bút xuống.
ĐỘC LẬP THIẾR BỊ 8
* Chúng ta đã gặp nhiều dạng “lệnh thiết bị” tùy theo thiết bị Các thiết bị vẽ đường như Plotter thì có các thủ tục Pen_Up, Pen_Down, Go_To (x,y) Thiết bị Raster thì có cá thủ tục SetPixel, Line Trong mọi trường hợp ta phải gửi đi tọa độ thiết bị, và mỗi thiết bị cóù riêng hệ tọa độ định sẵn. Điều đó gây ra hai vấn đề :
- Khó để tìm hiểu các ý tưởng và phương pháp cơ bản mà không biết chi tiết về thiết bị.
- Khó thay đổi một ứng dụng viết cho thiết bị này sang thiết bị khác.
Như vậy cần phải “che giấu” chi tiết về thiết bị trong các thủ tục “điều khiển” để có được dạng giao tiếp thống nhất cho ứng dụng. Động cơ bước
Trục Z Công tắc hành trình
Ví dụ : Chúng ta cần một thủ tục như Draw_Line(x1,y1,x2,y2:real) để vẽ đường thẳng từ điểm (x1,y1) đến điểm (x2,y2).
Bên trong là những lệnh có thể phụ thuộc tọa độ thiết bị, nhưng chương trình ứng dụng không cần biết chi tiết này Vì vậy nó được xem như thủ tục độc lập thiết bị.
* Xuất phát từ nhu cầu “Nếu ta dùng thiết bị đồ họa khác, mà không phải viết lại chương trình điều khiển hoặc ngay cả không cần biên dịch lại, mà chỉ cần nối kết chương trình điều khiển thiết bị mới” Độc lập thiết bị sẽ giúp bạn làm được điều ấy Để đảm bảo tính linh động, các tiêu chuẩn đồ họa đã thiết lập cho chương trình ứng dụng các thay đổi tối thiểu, cho phép nó định địa chỉ các thiết bị nhập khác nhau. Khởi đầu, người lập trình tạo ra một hệ thống tọa độ mô hình, trong đó mô tả một đối tượng gọi là Hệ tọa độ thực (World Coordinate_WC) Tiếp theo, người lập trình sẽ mô tả một Hệ thống tọa độ thiết bị chuẩn (Normalized Device Coordinate_NDC), bằng cách xác định các vùng hai chiều của bề mặt quan sát mà trên đó hình ảnh sẽ xuất hiện Sau đó các tọa độ thiết bị chuẩn sẽ chuyển sang tọa độ thiết bị (Device Coordinate).
Chương trình ứng dụng sẽ giao tiếp với hệ thống tọa độ chuẩn theo cách thức phù hợp, không quan tâm đến thiết bị xuất được sử dụng Do đó tạo ra được sự độc lập thiết bị trong việc tạo ảnh của đối tượng.
*Tọa độ thiết bị chuẩn hóa (NDC – Normalized Device Coordinate) :
KGS (Graphic Kernel System – một hệ chuẩn quốc tế) định nghĩa tọa độ thiết bị được chuẩn hóa (NDC) là vùng hình vuông với góc thấp trái là (0,0) và góc cao phải là (1,1), như trong hình dưới đây :
Không gian NDC là hệ tọa độ chuẩn cho mọi thiết bị, và một lệnh như Draw_Line() sẽ tự mở rộng khuôn này để vừa khớp với khuôn của thiết bị.
*Ánh xạ NDC lên thiết bị :
Mỗi lần xuất thủ tục LineNDC_() lên thiết bị phải ánh xạ hình vuông đơn vị của hình vuông lớn nhất tên thiết bị gọi là hình vuông thiết bị Nghĩa là, cho điểm bất kỳ P(x,y) trong NDC ta cần tính tọa độ thiết bị tương ứng Q(dx,dy) trong hình vuông thiết bị, như trong hình dưới đây :
Hệ thống tọa độ thực (WC) Hệ thống tọa độ chuẩn (NDC) Hệ thống tọa độ thiết bị (DC) Thiết bị vật lý
Phép ánh xạ này phải tỉ lệ Vì vậy dx phải ánh xạ tuyến tính theo x, sao cho : dx=Ax+B và dy=Cy+D với A,B,C,D là hằng số.
2/ỨNG DỤNG VÀO ĐỀ TÀI:
- Sau đây là đoạn chương trình minh họa việc chuyển đổi tọa độ của các điểm , đường từ hệ tọa độ trong AutoCad sang hệ tọa độ trong PC và hệ tọa độ bàn vẽ.
- Khai báo biến: p.x ; p.y :tọa độ trong AutoCad (Kích thước bản vẽ là Page_Width *
PC_p.x ; PC_p.y :tọa độ trong PC (Bàn vẽ trong PC là phần tử Image.canvas có kích thước 350*350).
Mv_p.x ; Mv_p.y :tọa độ trong bàn vẽ (Bàn vẽ của máy vẽ có kích thước 420*297).
- Procedure Chuyen_doi_toa_do ();
If (Page_Width div 350) > (Page_Height div 350) then Scale:=Round(Page_Width div 350)+1 else Scale:=Round(Page_Height div 350)+1;
Mv_p.x:=p.x*10; /* Mỗi bước của động cơ bút di chuyển được 0.1mm*/ Mv_p.y:=p.y*10;
GIỚI THIỆU TẬP TIN DXF 11
GIỚI THIỆU TẬP TIN DXF
Ngoài Autocad còn có rất nhiều phần mềm máy tính phục vụ cho các mục tiêu khác nhau và có những thế mạnh khác nhau Do đó, thế nào cũng có lúc nảy sinh nhu cầu sử dụng bản vẽ ACAD trong những phần mềm khác, đặc biệt là các phần mềm đồ họa.
Nếu các phần mềm máy tính khác cũng đọc được tập tin DWG như AUTOCAD thì không có vấn đề gì Tuy nhiên, cấu trúc tinh vi của tập tin Autocad DWG được hãng Autodesk giữ kín, nhằm tạo cho Autocad ưu thế độc quyền khai thác bản vẽ do chính mình tạo ra.
Nhưng để tạo tính tương thích của Autocad trên thị trường đồ họa, Autodesk đã thực hiện chính sách “mở cửa” bằng cách trang bị cho Autocad khả năng kết xuất bản vẽ của mình thành các dạng thức tập tin thông dụng cũng như đề ra một dạng thức tập tin bản vẽ đơn giản hơn gọi là DXF (Drawing data eXchange Format) và cho công bố rộng rãi cấu trúc của nó.
Ta có thể tìm thấy nhiều phần mềm lớn nhỏ khác nhau có khả năng đọc và ghi tập tin bản vẽ ở dạng thức DXF Quy cách ghi bản vẽ ở dạng thức DXF do hãng Autodesk đề ra và được phổ biến rộng rãi.
Do ưu thế của Autocad trên thị trường các phần mềm thiết kế, DXF hiện đã trở thành một tiêu chuẩn công nghiệp.
Tập tin DXF là một tập tin văn bản ASCII bình thường trong đó mô tả các quy định của bản vẽ và mô tả từng đối tượng Nói như vậy có nghĩa là bạn có thể dùng những chương trình soạn thảo văn bản để mở tập tin DXF và sửa chữa nội dung của nó Cách thức ghi thông tin như vậy thường lớn, do đó Autocad còn cho phép bạn ghi tập tin DXF theo một dạng gọn hơn, không thông qua mã ASCII để mô tả bản vẽ Đó là trường hợp của tập tin DXF dạng nhị phân (Binary DXF) Trong đề tài này chỉ quan tâm đến DXFASCII.
Về bản chất file DXF gồm những bộ mã và giá trị tương ứng Những đoạn mã, được hiểu như những nhóm mã cho biết dạng của giá trị theo sau Sử dụng những nhóm mã và giá trị, một file DXF được chia thành nhiều phần, bao gồm nhiều bảng dữ liệu, mỗi bảng dữ liệu bao gồm một nhóm mã và dữ liệu tương ứng Mã và giá trị tương ứng nằm trên cùng dòng trong file DXF.
Mỗi phần bắt đầu bằng một nhóm mã 0 theo sau bởi chuỗi SECTION Mỗi phần bao gồm nhiều nhóm mã và giá trị định nghĩa những phần tử của nó Phần cuối của một phân đoạn với ký tự 0 và theo sau bởi chuỗi ENDSEC.
Toàn thể cấu tạo của một file DXF có dạng như sau :
Thông thường thông tin về bản vẽ được tìm trong phần này Nó gồm có một bảng dữ liệu về số của phiên bản Autocad và số lượng biến hệ thống Mỗi thông số chứa một tên biến và giá trị tương ứng của nó.
Giữ những thông tin cho trình ứng dụng – xác định đặc điểm classes, những trường hợp đặc biệt trong BLOCKS, ENTITIES, và dữ liệu của mục OBJECTS.
Phần này chứa những định nghĩa của những ký hiệu sau đây :
BLOCK_RECORD (Block Reference Table)
UCS (User Coordinate System Table)
Chứa định nghĩa của khối và bản vẽ mà gộp thành mỗi khối tham chiếu trong bản vẽ.Phần ENTITIES :
Phần chứa những đối tượng đồ họa trong bản vẽ, bao gồm những khối tham chiếu (thực thể chèn vào).
Chứa những đối tượng không đồ họa trong bản vẽ.
Phần này trình bày các nhóm mã tập trung vào đối tượng đồ họa Các mã này xuất hiện trong phần ENTITIES của một file DXF và được sử dụng bởi các ứng dụng AutoLisp và ARX trong các danh sách định nghĩa thực thể.
Nhóm mã sau ứng dụng cho các đối tượng ARC :
10 Center point (in OCS) DXF: X value; APP: 3D point
20, 30 DXF: Y and Z values of center point (in OCS)
220, 230 DXF: Y and Z values of extrusion direction
Nhóm mã sau ứng dụng cho các đối tượng CIRCLE :
10 Center point (in OCS) DXF: X value; APP: 3D point
20, 30 DXF: Y and Z values of center point (in OCS)
220, 230 DXF: Y and Z values of extrusion direction
Nhóm mã sau ứng dụng cho các đối tượng ELLIPSE :
10 Center point (in WCS) DXF: X value; APP: 3D point
20, 30 DXF: Y and Z values of center point (in WCS)
11 Endpoint of major axis, relative to the center (in WCS).
21, 31 DXF: Y and Z values of endpoint of major axis, relative to the center (in WCS)
220, 230 DXF: Y and Z values of extrusion direction
40 Ratio of minor axis to major axis
41 Start parameter (this value is 0.0 for a full ellipse)
42 End parameter (this value is 2pi for a full ellipse)
Nhóm mã sau ứng dụng cho các đối tượng LINE :
10 Start point (in WCS) DXF: X value; APP: 3D point
20, 30 DXF: Y and Z values of start point (in WCS)
11 End point (in WCS) DXF: X value; APP: 3D point
21, 31 DXF: Y and Z values of end point (in WCS)
220, 230 DXF: Y and Z values of extrusion direction
Nhóm mã sau ứng dụng cho các đối tượng POINT :
10 Point location (in WCS) DXF: X value; APP: 3D point
20, 30 DXF: Y and Z values of point location (in WCS)
220, 230 DXF: Y and Z values of extrusion direction
50 Angle of the X axis for the UCS in effect when the point was drawn (optional, default = 0); used when PDMODE is nonzero
Nhóm mã sau ứng dụng cho các đối tượng POLYLINE :
100 Subclass marker (AcDb2dPolyline or AcDb3dPolyline)
APP: a "dummy" point; the X and Y values are always 0, and the Z value is the polyline's elevation (in OCS when 2D, WCS when 3D)
30 DXF: polyline's elevation (in OCS when 2D, WCS when 3D)
70 Polyline flag (bit-coded); default is 0:
1 = This is a closed polyline (or a polygon mesh closed in the M direction).
2 = Curve-fit vertices have been added.
4 = Spline-fit vertices have been added.
32 = The polygon mesh is closed in the N direction.
64 = The polyline is a polyface mesh.
128 = The linetype pattern is generated continuously around the vertices of this polyline.
40 Default starting width (optional; default = 0)
41 Default ending width (optional; default = 0)
71 Polygon mesh M vertex count (optional; default = 0)
72 Polygon mesh N vertex count (optional; default = 0)
73 Smooth surface M density (optional; default = 0)
74 Smooth surface N density (optional; default = 0)
75 Curves and smooth surface type (optional; default = 0); integer codes, not bit- coded:
220, 230 DXF: Y and Z values of extrusion direction
Nhóm mã sau ứng dụng cho các đối tượng SPLINE :
210 Normal vector (omitted if the spline is nonplanar)
220, 230 DXF: Y and Z values of normal vector
16 = Linear (planar bit is also set)
71 Degree of the spline curve
74 Number of fit points (if any)
12 Start tangent may be omitted (in WCS).
22, 32 DXF: Y and Z values of start tangent—may be omitted (in WCS).
13 End tangent may be omitted (in WCS).
23, 33 DXF: Y and Z values of end tangent—may be omitted (in WCS)
40 Knot value (one entry per knot)
41 Weight (if not 1); with multiple group pairs, are present if all are not 1
10 Control points (in WCS) one entry per control point.
20, 30 DXF: Y and Z values of control points (in WCS) (one entry per control point)
11 Fit points (in WCS) one entry per fit point.
21, 31 DXF: Y and Z values of fit points (in WCS) (one entry per fit point)
Nhóm mã sau ứng dụng cho các đối tượng TEXT :
10 First alignment point (in OCS)
20, 30 DXF: Y and Z values of first alignment point (in OCS)
1 Default value (the string itself)
41 Relative X scale factor—width (optional; default = 1).
This value is also adjusted when fit-type text is used.
7 Text style name (optional, default = STANDARD)
71 Text generation flags (optional, default = 0):
2 = Text is backward (mirrored in X),
4 = Text is upside down (mirrored in Y)
72 Horizontal text justification type (optional, default = 0) integer codes (not bit-coded)
5 = Fit (if vertical alignment = 0) See the following table for clarification
11 Second alignment point (in OCS)
This value is meaningful only if the value of a 72 or 73 group is nonzero (if the justification is anything other than baseline/left)
21, 31 DXF: Y and Z values of second alignment point (in OCS)
220, 230 DXF: Y and Z values of extrusion direction
73 Vertical text justification type (optional, default = 0): integer codes (not bit- coded)
0 = Baseline; 1 = Bottom; 2 = Middle; 3 = Top See the following table for clarification.
Dưới đây là 1 đoạn nhỏ của 1file DXF với các thông tin về 1đoạn thẳng (LINE) đi từ (X0,Y0,Z0) đến (X1,Y1,Z1) :
AcDbLine /* Bắt đầu đoạn LINE*/
GIẢI THUẬT VẼ 19
1/GIẢI THUẬT SINH ĐƯỜNG THẲNG a/ Nguyên lý chung :
Trên mặt phẳng bất kỳ, một điểm được xác định bởi cặp 2 giá trị tọa độ : một theo trục x và một theo trục y mô tả khoảng cách từ điểm đó đến các trục Điểm sẽ nằm trên đường thẳng khi giá trị tọa độ điểm thỏa mãn phương trình biểu diễn đường thẳng đó Việc biểu diễn đường thẳng có rất nhiều phương pháp khác nhau.
Nếu 2 điểm với tọa độ (x1,y1) và (x2,y2) được sử dụng để xác định nên một đường thẳng thì phương trình của đường thẳng qua hai điểm được viết lại như sau :
Từ phương trình này chúng ta có thể xây dựng quá trình vẽ các đường thẳng khi cho x biến thiên theo các khoảng x và kết quả ta có thể thu được giá trị của biến y thay đổi với các khoảng y tương ứng (y=kx).
Do các đường thẳng được mô tả trong hệ tọa độ thực khi hiển thị trong máy tính, hệ tọa độ chính là lưới nguyên nên bản chất của quá trình vẽ các đường thẳng chính là sự nguyên hóa các tọa độ các điểm thuộc đường thẳng và vẽ các pixel tương ứng. Nguyên lý chung là cho một thành phần tọa độ x hay y biến đổi theo từng đơn vị và tính tọa độ nguyên còn lại sao cho gần với tọa độ thực nhất Việc quyết định chọn x hay y biến đổi phụ thuộc vào độ rộng của đường thẳng. b/ Giải thuật trung điểm sinh đường thẳng (MidPoint) :
Giải thuật điểm giữa (Midpoint) được Pitteway đưa ra những năm 1967 và được VanAken áp dụng cho việc sinh các đường thẳng và đường tròn năm 1985 cho ra các công thức đơn giản và tạo được các điểm tương tự với giải thuật Bresenham.
Giả sử điểm (xi,yi) là điểm hiện thời và với giải thuật Bresenham, việc quyết định điểm A hay điểm B là điểm kế tiếp là việc lựa chọn giá trị yi+1 hay yi dựa vào khoảng cách từ AS hay từ BS Và như vậy giải thuật đã bỏ qua yếu tố đánh giá đơn giản là : điểm M, trung điểm của đoạn AB, mà qua đó việc so sánh chỉ đơn giản là quá trình xét xem M nằm trên hay dưới đường thẳng cần sinh.
Nếu M nằm dưới thì điểm A được chọn, nếu ngược lại M nằm trên thì điểm B được chọn Giả sử như ta có phương trình đoạn thẳng được biểu diễn dưới dạng không tường minh cùng với các hệ số a,b như sau :
F(x,y) = ax+by+c = 0 Nếu đặt dx = x2-x1 và dy = y2-y1
Phương trình chuyển về dạng : y = (dx/dy).x + B Hay F(x,y) = dx.x-dy.y+B.dx = 0
Như vậy a=dx; b=-dy; c=B.dx
Với phương trình trên thì F(x,y) = 0 với mọi điểm (x,y) nằm trên đường thẳng, F(x,y)>0 với các điểm nằm dưới đường và 0 điểm
B được chọn, nếu d Đối với các động cơ có 4 hay 5 cuộn dây thì cần có 5 hay 6 đầu dây và cách điều khiển thì tương tự như cách điều khiển động cơ có 3 cuộn dây Nhưng cần phải lưu ý thứ tự kích các cuộn dây để động cơ hoạt động.
Hình là một động cơ với bước là 30 độ vì chỉ sử dụng một số ít rang rotor và cực stator Nếu ta chế tạo thêm nhiều răng rotor và cực stator thì sẽ được động cơ với bước nhỏ hơn. c/ Động cơ đơn cực :
Hình : Động cơ bước đơn cực Động cơ bước đơn cực với 5 hay 6 đầu dây ra thường có dạng như hình vẽ…Mỗi cuộn dây có một đầu chung là điểm giữa của cuộn dây Khi vận hành điểm giữa này thường được nối với nguồn cung cấp, mỗi đầu còn lại sẽ được tuần tự nối xuống mass. Tùy theo đầu nào được nối mass mà ta xác định được chiều quay của rotor.
Hình…là một động cơ có bước 30 độ Rotor của động cơ là một nam châm vĩnh cửu có 6 cực (3 cực bắc, 3 cực nam) được bố trí vòng quanh rotor Để cho bước của rotor nhỏ hơn nữa, rotor phải có nhiều cực đối xứng hơn Ngày nay động cơ bước nam châm vĩnh cửu có thể đạt đến 1.8 độ/bước.
Như trong hình vẽ, dòng điện chạy từ điểm giữa của cuộn dây đến điểm cuối làm cho đỉnh trên của stator trở thành cực bắc trong khi đỉnh dưới là cực nam, nó hút rotor về vị trí như hình vẽ. Để điều khiển rotor quay ta chỉ việc cấp điện cho hai cuộn dây như sau :
Chú ý rằng hai nữa của cùng một cuộn dây không bao giờ được cấp điện đồng thời Cả hai cách kích như trên đều làm cho động cơ bước 1 bước tại một thời điểm Cách đầu tiên chỉ có một cuộn dây tại một thời điểm được cấp điện nên tiêu tốn năng lượng ít hơn Cách thứ hai thì tại một thời điểm có hai cuộn dây được cấp điện và như vậy nó tốn nhiều năng lượng hơn, nhưng bù lại nó cung cấp một moment lớn gấp 1,4 lần cách thứ nhất.
Vị trí mỗi bước ở các cách trên là khác nhau nên khi phối hợp hai cách kích trên ta sẽ được half-step Nguyên tắc kích như sau :
Thời gian -> d/ Động cơ lưỡng cực :
Hình : Động cơ bước lưỡng cực Động cơ bước lưỡng cực nam châm vĩnh cửu được cấu tạo về phần cơ khí giống hệt loại đơn cực, nhưng mỗi cuộn dây thì đơn giản hơn nhiều thay vì được chia làm hai như ở động cơ đơn cực Tuy nhiên mạch điều khiển để đổi chiều quay động cơ lưỡng cực thì phức tạp hơn nhiều
Mạch điều khiển cho mỗi động cơ yêu cầu một mạch cầu H (H-bridge) cho mỗi cuộn dây Nói ngắn gọn mạch cầu H cho phép cung cấp năng lượng một cách độc lập mỗi đầu cuộn dây Tín hiệu điều khiển tuần tự cho mỗi bước được cho dưới đây Dấu +,- cho ta thấy chiều của dòng điện trong mỗi cuộn dây.
Thông thường IC H-bridge có một tín hiệu cho phép xuất và một tín hiệu khác dùng để điều khiển chiều quay cho mỗi cực.
Ta có thể nhận ra động cơ bước lưỡng cực nam châm vĩnh cửu 4 đầu dây bằng cách đo điện trở giữa các đầu dây ta sẽ xác định được hai cuộn dây Trong mỗi cuộn dây nếu hai đầu được mắc nối tiếp thì có thể động cơ ấy sử dụng điện áp cao Nếu chúng được mắc song song thì có thể dùng điện áp thấp Nếu chúng được nối nối tiếp với điểm chung thì có thể sử dụng như là động cơ đơn cực. e/ Động cơ nhiều pha :
Hình: Động cơ 5 pha mắc hình sao Động cơ này hiếm thấy trong các động cơ bước nam châm vĩnh cửu Dây của tất cả các cuộn dây được nối nối tiếp tuần hoàn, với một nút giữa hai cặp cuộn dây trên đường trũn Phổ biến nhất là loại 3 pha hay 5 pha Điều khiển động cơ này cần ẵ cầu H cho mỗi cực của rotor, những loại động cơ này có thể cung cấp moment lớn hơn so với những động cơ khác cùng kích thước Động cơ 5 pha có thể đạt tới 0.72 độ/bước
Với loại động cơ 5 pha, sẽ có 10 bước cho mỗi chu kỳ như sau :
TỔNG KẾT 53
Có thể nói đây là một đề tài luận văn tốt nghiệp rất hay , nó giúp sinh viên củng cố những kiến thức đã học trên lớp , đồng thời có thêm những kinh nghiệm thực tế và những kiến thức mới khi nghiên cứu thực hiện.
Trong luận văn này có áp dụng một số giải thuật rất hay giúp nâng cao tốc độ xử lý , ví dụ như giải “2 trung điểm sinh đường tròn”.
Luận văn cũng giúp ta có được những hiểu biết cơ bản nhất về AutoCad , một trong những phần mềm kỹ thuật được sử dụng rộng rãi nhất.
Do thời gian thực hiện luận văn có hạn nên máy vẽ chỉ có thể vẽ được các đường cơ bản như LINE , POLYLINE , CIRCLE , SPLINE Riêng với đường SPLINE tốc độ vẽ là khá chậm.
Do thời gian có hạn mà bản thân quyển báo cáo luận văn này cũng chỉ nói được những ý cơ bản nhất mà không thể nêu lên chi tiết quá trình thực hiện luận văn và hẳn cũng không tránh khỏi những sơ sót trong khi ghi chép , em xin kính mong thầy cô thông cảm
Hình : Sơ đồ nguyên lý phần cứng P 0 3
CB 4 VC C (5 V) CB 2 Mo torX _3 Mo torX _2
End X (CB4) Start X (CB3) CB1
Các dây nối trên bàn vẽ
CHƯƠNG TRÌNH CHO PC unit MainEdit; procedure TMainEditForm.Exit1Click(Sender: TObject); begin
Close; end; procedure TMainEditForm.OpenDXFfile1Click(Sender: TObject); begin
OpenFileDialog.Filter:='DXF file(*.dxf)|*.dxf';
With TEditForm.Create(self) do
End; end; procedure TMainEditForm.Tile1Click(Sender: TObject); begin
Tile; end; procedure TMainEditForm.Cascade1Click(Sender: TObject); begin
Cascade; end; procedure TMainEditForm.ArrangeIcon1Click(Sender: TObject); begin
ArrangeIcons; end; procedure TMainEditForm.About1Click(Sender: TObject); begin
With TAbout.Create(self) do try
Free; end; end; procedure TMainEditForm.OpenCNCfile1Click(Sender: TObject); begin
OpenFileDialog.Filter:='Text file(*.txt)|*.txt';
With TEditForm.Create(self) do begin
Destination:=OpenFileDialog.FileName; end; end; procedure TMainEditForm.NewCNCfile1Click(Sender: TObject); begin
NewForm.caption:='Untiled'; end; procedure TMainEditForm.FormCreate(Sender: TObject); begin
{ With TStart.Create(self) do try
Free; end;} end;end. unit Edit; var EditForm: TEditForm;
Destination,PathName:string; f,fout:TextFile; x0,y0,Current_X,Current_Y:real; const
Send_File='c:\my documents\luan van\pc\huy.txt'; implementation uses MainEdit, DrawForm;
Procedure TEditForm.Open(const Filename:string);
End;procedure TEditForm.File1Click(Sender: TObject); begin
MainEditForm.Exit1Click(Sender); end; procedure TEditForm.OpenCNCfile1Click(Sender: TObject); begin
MainEditForm.OpenCNCfile1Click(Sender); end; procedure TEditForm.OpenDXFfile1Click(Sender: TObject); begin
TransferToCNC1.Enabled:=true; end; procedure TEditForm.Exit1Click(Sender: TObject); begin
MainEditForm.Exit1Click(sender); end; procedure TEditForm.Tile1Click(Sender: TObject); begin
MainEditForm.Tile1Click(Sender); end; procedure TEditForm.Cascade1Click(Sender: TObject); begin
MainEditForm.Cascade1Click(sender); end; procedure TEditForm.ArrangeIcon1Click(Sender: TObject); begin
MainEditForm.ArrangeIcon1Click(sender); end; procedure TEditForm.About1Click(Sender: TObject); begin
MainEditForm.About1Click(sender); end; procedure TEditForm.Print1Click(Sender: TObject); begin
Editor.Print(PathName); end; procedure TEditForm.PrinterSetup1Click(Sender: TObject); begin
PrinterSetupDialog1.Execute; end; procedure TEditForm.FormCreate(Sender: TObject); begin
Current_Y:=0; end; procedure TEditForm.Close1Click(Sender: TObject); begin
{ TransferToCNC1.Enabled:=true;} end; procedure TEditForm.FormClose(Sender: TObject; var Action: TCloseAction); begin
Action:ree; end; function no_blank(str:string):string; var i:integer; begin for i:=1 to length(str) do if str[i]=' ' then delete(str,i,1); no_blank:=str; end;
Procedure TEditForm.Process_G0(x1,y1:real); var str:string;
If (RoundTo(x1,-1)RoundTo(Current_X,-1)) or(RoundTo(y1,-1)RoundTo(Current_Y,-1)) then begin writeln(fout,'G0'); str:=FloatToStrF(x1,ffNumber,16,6); writeln(fout,str); str:=FloatToStrF(y1,ffNumber,16,6); writeln(fout,str);
End; procedure TEditForm.write_Arc(xc,yc,r,x2,y2:real); var str:string;
Str:=FloatToStrF(xc,ffNumber,16,6); writeln(fout,Str);
Str:=FloatToStrF(yc,ffNumber,16,6); writeln(fout,Str);
Str:=FloatToStrF(r,ffNumber,16,6); writeln(fout,Str);
Str:=FloatToStrF(x2,ffNumber,16,6); writeln(fout,Str);
Str:=FloatToStrF(y2,ffNumber,16,6); writeln(fout,Str);
End; procedure TEditForm.ProcessSize; var str:string; begin readln(f,str); str:=no_blank(str); if str='10' then begin writeln(fout,'Size'); readln(f,str); str:=no_blank(str); writeln(fout,str); readln(f,str); readln(f,str); str:=no_blank(str); writeln(fout,str); writeln(fout,'End Size'); end; end;
Procedure TEditForm.ProcessPoint; var str:string;
Begin readln(f,str); writeln(fout,'AcDbPoint'); readln(f,str); str:=no_blank(str); writeln(fout,str); x0:=StrToFloat(Str); readln(f,str); readln(f,str); str:=no_blank(str); writeln(fout,str); y0:=StrToFloat(Str); writeln(fout,'End AcDbPoint');
Procedure TEditForm.ProcessLine; var str:string; x1,y1,temp:real; begin readln(f,str); str:=no_blank(str); while str'10' do begin readln(f,str); str:=no_blank(str); end; readln(f,str); str:=no_blank(str); x1:=StrToFloat(Str)-x0; readln(f,str); str:=no_blank(str); while str'20' do begin readln(f,str); str:=no_blank(str); end; readln(f,str); str:=no_blank(str); y1:=StrToFloat(Str)-y0;
Process_G0(x1,y1); writeln(fout,'G1'); readln(f,str); str:=no_blank(str); while str'11' do begin readln(f,str); str:=no_blank(str); end; readln(f,str); str:=no_blank(str); temp:=StrToFloat(Str)-x0;
Str:=FloatToStrF(temp,ffnumber,16,6); writeln(fout,str); readln(f,str); str:=no_blank(str); while str'21' do begin readln(f,str); str:=no_blank(str); end; readln(f,str); str:=no_blank(str); temp:=StrToFloat(Str)-y0;
Str:=FloatToStrF(temp,ffnumber,16,6); writeln(fout,str); end; procedure TEditForm.ProcessPolyline; var str:string; rem,check,closed_poly,first_Point:boolean; x1,y1,xb,yb:real; begin rem:se; closed_poly:se;
First_Point:=True; readln(f,str); str:=no_blank(str); while str'70' do begin readln(f,str); str:=no_blank(str); end; readln(f,str); str:=no_blank(str); if pos('1',str)0 then closed_poly:=true; readln(f,str); str:=no_blank(str); while str'10' do begin readln(f,str); str:=no_blank(str); end; check:=true; while check do begin readln(f,str); str:=no_blank(str); xb:=StrToFloat(Str)-x0; if closed_poly then x1:=xb; readln(f,str); readln(f,str); str:=no_blank(str); yb:=StrToFloat(Str)-y0; if First_Point then begin
First_Point:se; end; if closed_poly then begin y1:=yb; closed_poly:se; rem:=true; end else begin writeln(fout,'G1');
Str:=FloatToStrF(xb,ffNumber,16,6); writeln(fout,str);
Str:=FloatToStrF(yb,ffNumber,16,6); writeln(fout,str);
Current_Y:=xb; end; readln(f,str); str:=no_blank(str); if str'10' then check:se; end; if rem then begin writeln(fout,'G1');
Str:=FloatToStrF(x1,ffNumber,16,6); writeln(fout,str);
Str:=FloatToStrF(y1,ffNumber,16,6); writeln(fout,str); end; end; procedure TEditForm.ProcessCircle; var str:string; circheck:boolean; x1,y1,bk,ang1,ang2,Start_x,Start_y,End_X,End_Y:real; temp:integer; begin readln(f,str); str:=no_blank(str); while str'10' do begin readln(f,str); str:=no_blank(str); end; readln(f,str); str:=no_blank(str); x1:=StrToFloat(Str)-x0; readln(f,str); str:=no_blank(str); while str'20' do begin readln(f,str); str:=no_blank(str); end; readln(f,str); str:=no_blank(str); y1:=StrToFloat(Str)-y0; readln(f,str); str:=no_blank(str); while str'40' do begin readln(f,str); str:=no_blank(str); end; readln(f,str); str:=no_blank(str); bk:=StrToFloat(str); readln(f,str); if pos('100',str)0 then circheck:se else circheck:=true; if circheck then begin
Write_Arc(x1,y1,bk,x1,y1+bk); writeln(fout,'G2');
Write_Arc(x1,y1,bk,x1+bk,y1); writeln(fout,'G2');
Write_Arc(x1,y1,bk,x1,y1-bk); writeln(fout,'G2');
Current_Y:=y1; end else begin readln(f,str); str:=no_blank(str); while str'50' do begin readln(f,str); str:=no_blank(str); end; readln(f,str); str:=no_blank(str); ang1:=StrToFloat(str); readln(f,str); str:=no_blank(str); while str'51' do begin readln(f,str); str:=no_blank(str); end; readln(f,str); str:=no_blank(str); ang2:=StrToFloat(str);
If ang2(Page_Height/Drawing.Image1.Height) then Image_Scale:=Round(Page_Width/Drawing.Image1.Width)+1
Image_Scale:=Round(Page_Height/Drawing.Image1.Height)+1;
With Drawing.Image1.Canvas do begin
Arect:=Rect(0,0,Drawing.Image1.width,Drawing.image1.Height);
CopyRect(ARect,Drawing.Image1.Canvas,ARect);
{pen.color:=ClBlack; with Drawing.image1 do canvas.Rectangle(C_P.x-round(table_width/2/Image_Scale),C_P.y-round(table_height/2/ Image_Scale),C_P.x+round(table_Width/2/Image_Scale),C_P.y+round(table_height/2/
Image_Scale));} pen.color:=ClBlue; moveto(0,C_P.y); lineto(Drawing.Image1.Width,C_P.y); moveto(C_P.x,0); lineto(C_P.x,Drawing.Image1.Height); moveto(C_P.x,C_P.y); end; end; procedure TEditForm.NewCNCfile1Click(Sender: TObject); begin
MainEditForm.NewCNCfile1Click(Sender); end;
Procedure TEditForm.Pre_Run_Draw;
Var f:TextFile; f1:TextFile; cx,cy,r,Str:string; cur_x,cur_y,new_x,new_y:real; i,numknots,numpoints:integer; count:integer;
Data:array[0 100]of real; temp:Real;
Writeln(f1,'G9'); for i:=1 to 5 do writeln(f1,'0'); writeln(f1,'G6'); temp:=(ord(' ')*256+ord('L'))/10; writeln(f1,FloatToStr(temp)); temp:=(ord('i')*256+ord('n'))/10; writeln(f1,FloatToStr(temp)); temp:=(ord('e')*256+ord(' '))/10; writeln(f1,FloatToStr(temp)); temp:=(ord('t')*256+ord('o'))/10; writeln(f1,FloatToStr(temp)); temp:=(ord(':')*256+ord(' '))/10; writeln(f1,FloatToStr(temp)); writeln(f1,'G8'); for i:=1 to 5 do writeln(f1,'0'); writeln(f1,'G10'); for i:=1 to 5 do writeln(f1,'0'); readln(f,str); new_x:=StrToFloat(str); readln(f,str); new_y:=StrToFloat(str); str:='X='+FloatToStrF(new_x,ffnumber,7,1)+' '+'Y='+FloatToStrF(new_y,ffnumber,7,1); while (length(str) MOD 10)0 do str:=str+' '; for i:=1 to length(str) do begin if (i MOD 10)=1 then writeln(f1,'G6'); if (i mod 2)=1 then temp:=ord(str[i]); if (i mod 2)=0 then begin temp:=temp*256+ord(str[i]); writeln(f1,FloatToStr(temp/10)); end; end;{for} writeln(f1,'G8'); for i:=1 to 5 do writeln(f1,'0'); writeln(f1,'G0'); writeln(f1,FloatToStr(cur_x)); writeln(f1,FloatToStr(cur_y)); writeln(f1,'0'); writeln(f1,FloatToStr(new_x)); writeln(f1,FloatToStr(new_y));