Từ 1 tới 4 trên tổng số 4 kết quả

Đề tài: Vấn đề với thuật toán vẽ đương thăng DDA trên VC++ 2005

  1. #1
    Ngày gia nhập
    09 2006
    Bài viết
    20

    Mặc định Vấn đề với thuật toán vẽ đương thăng DDA trên VC++ 2005

    Mình vừa coding xong thuật toán DDA và BResenham, chương trình hoạt động tót với các đoạn thằng ngắn, nhưng khi mình nhập 2 điểm cách xa nhau trên cùng tung độ thì có vấn đề
    A.x = 10
    A.y = 200
    B.x = 800
    B.y = 200

    thì đoạn thăng đang vẽ nằm ngang thì đứt một khoảng rồi vẽ tiếp
    minh họa _____________<chỏ này trống>______________. Như vậy đó
    trong khi vẽ 2 điểm cùng hoành độ thì Ok
    Mình kô thể hiểu được. Và cùng kô thể debug vì thuật toạn đúng với những điểm đầu (đoạn thẳng ngắn).
    cả thuật toán bresenham cũng bị vậy
    Code:
    void CLine::drawLine_DDA(CDC *pDC, int color)
    {
    	if(this->m_p1 == this->m_p2)
    		pDC->SetPixel(this->m_p1, color);
    	if(abs(m_p2.x - m_p1.x) > abs(m_p2.y - m_p1.y))
    	{
    		if(m_p1.x > m_p2.x)
    		{
    			CPoint temp;
    			temp = m_p1;
    			m_p1 = m_p2;
    			m_p2 = temp;
    		}
    		drawLine1_DDA(pDC, color);
    	}
    
    	else
    	{
    		if(m_p1.y > m_p2.y)
    		{
    			CPoint temp;
    			temp = m_p1;
    			m_p1 = m_p2;
    			m_p2 = temp;
    		}
    		drawLine2_DDA(pDC, color);
    	}
    
    }
    void CLine::drawLine1_DDA(CDC *pDC, int color)
    {
    	int x = this->m_p1.x;
    	float y = this->m_p1.y;
    	float m = (float)(m_p2.y - m_p1.y)/(m_p2.x - m_p1.x);
    	
    	while(x < m_p2.x)
    	{
    		pDC->SetPixel(x,Round(y), color);
    		x++;
    		y += m;
    		//Sleep(50);
    	}
    }

  2. #2
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    Hix, mới học xong mà sao giờ mình nhìn lại mấy cái này thấy nhức cả đầu @-)

    Code:
    void DDAAlgo::DrawLine(int x1, int y1, int x2, int y2, DWORD c)
    {
    	// kiểm tra nếu x1>x2 thì hóan vị
    	if (x1 > x2)
    	{
    		Swap(x1, x2);
    		Swap(y1, y2);
    
    	}
    
    	// tính Dx và Dy
    	int Dx = x2 - x1;
    	int Dy = y2 - y1;
    
    	// tính hệ số góc m
    	float m = Dy / (float)Dx;
    
    	// nếu hệ số góc |m| > 1
    	if (abs(m) > 1)
    	{
    		// hoán chuyển giá trị của x và y
    		Swap(x1, y1);
    		Swap(x2, y2);
    	}
    
    	// tính b
    	float b = -m * x1 + y1;
    
    	// vẽ .....
    	for (int x = x1; x < x2; ++x)
    	{
    		SetPixel(hdc, x, (int)floor(m * x + b), c);
    	}
    }
    Keep moving forward!

    ... Retired ...

  3. #3
    Ngày gia nhập
    10 2007
    Bài viết
    9

    Trích dẫn Nguyên bản được gửi bởi trieuanhl Xem bài viết
    Mình vừa coding xong thuật toán DDA và BResenham, chương trình hoạt động tót với các đoạn thằng ngắn, nhưng khi mình nhập 2 điểm cách xa nhau trên cùng tung độ thì có vấn đề
    A.x = 10
    A.y = 200
    B.x = 800
    B.y = 200

    thì đoạn thăng đang vẽ nằm ngang thì đứt một khoảng rồi vẽ tiếp
    minh họa _____________<chỏ này trống>______________. Như vậy đó
    trong khi vẽ 2 điểm cùng hoành độ thì Ok
    Mình kô thể hiểu được. Và cùng kô thể debug vì thuật toạn đúng với những điểm đầu (đoạn thẳng ngắn).
    cả thuật toán bresenham cũng bị vậy
    Bạn chỉ post hàm vẽ cho trường hợp hệ số góc nhỏ, trong khi phần vẽ bị sai là hệ số góc lớn, như vậy chưa thể khẳng định được sai chỗ nào. Mà cũng ko cần phải chia ra như thế đâu, chỉ cần tính số bước lặp và tính toán sự thay đổi tọa độ thực là có thể vẽ được rùi.
    Code:
    void CLine::drawLine_DDA(CDC *pDC, int color)
    {
    if(this->m_p1 == this->m_p2) {
    pDC->SetPixel(this->m_p1, color); return;
    } int dx = m_p1.x - m_p2.x, dy = m_p1.y - m_p2.y, steps = 0; float xInc = 0, yInc = 0, x = m_p1.x, y = m_p1.y; if (abs(dx) > abs(dy))
    steps = abs(dx);
    else
    steps = abs(dy);
    xInc = dx/(float)steps; yInc = dy/(float)steps; pDC->SetPixel(Round(x), Round(y), color); for (int i = 0; i < steps; i ++) {
    x += xInc; y += yInc; pDC->SetPixel(Round(x), Round(y), color);
    }
    }

  4. #4
    Ngày gia nhập
    09 2006
    Bài viết
    20

    Mặc định thêm rắc rối nữa rồi

    Hừm, các bạn à thì ra thuật toán của mình không hề sai. Hom nay mình đã kiểm tra lại.

    vấn đề ở đây là màn hình của mình không vẽ được đường thẳng trong một vùng nào đó, nhưng với hàm pDC->lineto thì vẽ rất tốt

    Hôm nay mình thực hiện hàm vẽ ngủ giác dựa trên DDA đã post trước
    Code:
            this->setPoint(p);
    	this->setR(r);
    	this->n = 5;
    	CPoint Dinh[5];
    	float alpha = 0;
    	//tinh toa do cac dinh ngu giac
    	for(int i=0; i<n; i++)
    	{
    		Dinh[i].x = this->m_I.x + r*cos(alpha);
    		Dinh[i].y = this->m_I.y - r*sin(alpha);
    		alpha += 2*PI/5;
    	}
    
    	//ve
    	for(int i=0; i<n; i++)
    	{
    		int j = i+1;
    		if(j == n)
    			j = 0;
    		CLine l;
    		l.VeDuongThang_DDA(Dinh[i],Dinh[j],RGB(255,255,0),pDC);
    	}
    hàm này khá đơn giản, không có gì để nói, trong đây có biến m_I chính là tâm của ngủ giác này.

    Vấn đề là ở đây. Khi mình cho giá trị tâm (300,300) thì vẽ chỉ được một nữa phải ngủ giác, có lẻ vào vùng màn hình kô vẽ được. Nhưng khi mình để tâm lớn hơn hoặc nhỏ hơn (100,100) thì vẽ tốt, nhưng nếu lại để m_I(750,300) thì vẽ được nữa trái. Khó hiểu quá

    Nhưng khi dùng LineTo thì mình vẽ được tất. Vậy là do lổi gì. Mình bó tay rồi

Các đề tài tương tự

  1. Kỹ thuật C++ giải thuật và thuật toán vẽ 3 đường conic
    Gửi bởi luuvanhoa93 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 0
    Bài viết cuối: 04-09-2013, 11:36 AM
  2. Chung cư Làng Quốc Tế Thăng Long, bán căn 1002,có thỏa thuận
    Gửi bởi datphat191 trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 03-11-2011, 09:25 AM
  3. Máy bay trực thăng điều khiển Z008 4 kênh hàng Hot nhất trên TG đã có mặt tại đây
    Gửi bởi balinh88 trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 31-07-2011, 06:29 PM
  4. BAI TAP C cần vẽ sơ đồ khối + thuật toán tương ứng!!!HELP
    Gửi bởi luckytomato611 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 05-11-2010, 09:45 PM
  5. interval timer trên C# | Lấy mẫu vẽ đồ thị trên C#. Giúp mình với?
    Gửi bởi mrvui trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 09-05-2009, 10:16 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn