|
|
 Prize winner in Competition
"MFC/C++ May 2003"
Comments and Discussions
|
|
 |

|
I fail to see how making Alexander Chernosvitov 's code into an ActiveX control adds much utility. I believe that ActiveX controls have fallen out of fashion. It would be nice if the author would update this code without involving ActiveX. Then it would be extremely useful to many. As it is, it is full of errors and warnings when one attempts to compile it in VS 2008. While I certainly appreciate the effort the author put into this, I hope he or someone can update it. Still gets a 5 from me, but it's now too long in the tooth.
|
|
|
|
|

|
I can't run this demos (Demo3D and Torus) from C++ Builder 6. Please, tell me step by step what I must to do.
|
|
|
|

|
error C2664: 'CGraphCtl::SetLight' : cannot convert parameter 1 from 'std::_Vector_iterator<_Ty,_Alloc>' to 'CElement *'
error C2664: 'CGraphCtl::PtInRange' : cannot convert parameter 1 from 'std::_Vector_iterator<_Ty,_Alloc>' to 'CPoint3D *'
error C2664: 'CGraphCtl::Corrdinate' : cannot convert parameter 1 from 'std::_Vector_iterator<_Ty,_Alloc>' to 'CPoint3D *'
error C2664: 'CGraphCtl::PtInRange' : cannot convert parameter 1 from 'std::_Vector_iterator<_Ty,_Alloc>' to 'CPoint3D *'
error C2664: 'CGraphCtl::Corrdinate' : cannot convert parameter 1 from 'std::_Vector_iterator<_Ty,_Alloc>' to 'CPoint3D *'
error C2668: 'sqrt' : ambiguous call to overloaded function
Can anybody please help me to solve these errors???
|
|
|
|

|
If you run into this one you can do an explicit conversion to a pointer. For instance, in GraphCtl.cpp around line 1104 the for loop can be changed to:
for (aPoint; aPoint != theElement->m_PointList.end(); aPoint++)
{
CPoint3D* myPoint = &(*aPoint);
if (PtInRange(myPoint))
{
CPoint3D pt = Corrdinate(myPoint);
glVertex3f(pt.x,pt.y,pt.z);
}
}
|
|
|
|

|
Does anyone have a complete VB example of how to get this demo working in a VB project?
|
|
|
|

|
download NTGraph3D demo, extract files and double click on Demo3D.hta to see it run in a browser.
you can open same file and code is nearly identical to VB, so you can simply copy and paste.
of course you need to create new VB application (standard EXE) and add reference (Ctrl+T) to NTGraph after registering ntgraph3d.dll.
this will allow you to drop new NTGraph control onto VB form.
can't post file but here is entire form of VB6 demo version.
VERSION 5.00
Object = "{7A99C13D-22DF-400C-AB37-48C32A897EFB}#1.0#0"; "ntgraph3d.dll"
Begin VB.Form Form1
Caption = "ibyk30 : NTGraph3D demo in VB6"
ClientHeight = 11850
ClientLeft = 60
ClientTop = 345
ClientWidth = 18495
LinkTopic = "Form1"
ScaleHeight = 11850
ScaleWidth = 18495
StartUpPosition = 3 'Windows Default
Begin VB.Frame Frame1
Caption = "Track Mode"
Height = 2415
Left = 17160
TabIndex = 5
Top = 3840
Width = 1215
Begin VB.OptionButton radTrackModeRotate
Caption = "Rotate"
Height = 495
Left = 120
TabIndex = 9
Top = 1200
Width = 975
End
Begin VB.OptionButton radTrackModePan
Caption = "Pan"
Height = 495
Left = 120
TabIndex = 8
Top = 1680
Width = 975
End
Begin VB.OptionButton radTrackModeZoom
Caption = "Zoom"
Height = 375
Left = 120
TabIndex = 7
Top = 840
Width = 855
End
Begin VB.OptionButton radTrackModeLock
Caption = "Lock"
Height = 375
Left = 120
TabIndex = 6
Top = 360
Value = -1 'True
Width = 975
End
End
Begin VB.CommandButton btnKlein
Caption = "Klein Bottle"
Height = 615
Left = 17160
TabIndex = 4
Top = 2280
Width = 1215
End
Begin VB.CommandButton btnSine
Caption = "Sine"
Height = 615
Left = 17160
TabIndex = 3
Top = 1560
Width = 1215
End
Begin VB.CommandButton btnButterfly
Caption = "Butterfly"
Height = 615
Left = 17160
TabIndex = 2
Top = 840
Width = 1215
End
Begin VB.CommandButton btnTorus
Caption = "Torus"
Height = 615
Left = 17160
TabIndex = 1
Top = 120
Width = 1215
End
Begin NTGRAPH3DLibCtl.NTGraph3D NTGraph3D
Height = 11655
Left = 120
OleObjectBlob = "Form1.frx":0000
TabIndex = 0
Top = 120
Width = 16815
End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit
Dim i As Integer
Dim j As Integer
Dim ti As Double
Dim tj As Double
Dim x As Double
Dim y As Double
Dim z As Double
Dim csv(800, 1024) As Single
Private Sub btnTorus_Click()
With NTGraph3D
.ClearGraph
.AddElement
.Caption = "Torus"
.ElementType(0) = 3 'Draw Surface
For i = 0 To 40
ti = (i - 20) / 20 * 3.15
For j = 1 To 41
tj = (j - 20) / 20 * 3.15
x = (Cos(tj) + 3) * Cos(ti)
y = Sin(tj)
z = (Cos(tj) + 3) * Sin(ti)
.PlotXYZ x, y, z, 0
Next
Next
.AutoRange
End With
End Sub
Private Sub btnSine_Click()
With NTGraph3D
.ClearGraph
.AddElement
.Caption = "Double Sine"
For i = 0 To 40
x = ((i - 20) / 20) * 3.15
For j = 0 To 40
NTGraph3D.AddElement
z = ((j - 20) / 20) * 3.15
y = Sin(x) * Cos(z) + 2
NTGraph3D.ElementType(j) = 0
NTGraph3D.ElementLineColor(i) = RGB(255, 0, 0)
NTGraph3D.PlotXYZ x, y, z, j
Next
Next
.AutoRange
End With
End Sub
Private Sub btnButterfly_Click()
Dim hold1 As Double
Dim holdm As Double
With NTGraph3D
.Caption = "Butterfly"
.ClearGraph
.AddElement
.ElementType(0) = 3
For i = 0 To 41
ti = (i - 20) / 20 * 3.15
For j = 0 To 41
tj = (j - 20) / 20 * 3.15
hold1 = Sin(tj)
holdm = Cos(ti * 0.5) * hold1 - Sin(ti * 0.5) * Sin(tj * 2)
x = holdm * Cos(ti)
y = holdm * Sin(ti) * 0.5
z = Sin(ti * 0.5) * hold1 + Cos(ti * 0.5) * Sin(tj * 0.5)
.PlotXYZ x, y, z, 0
Next
Next
.AutoRange
End With
End Sub
Private Sub btnKlein_Click()
Dim u As Double
Dim v As Double
Dim rad As Double
Dim Bx As Double
Dim By As Double
Dim Pi As Double
With NTGraph3D
.Caption = "Klein Bottle"
.ClearGraph
.AddElement
.ElementPointColor(0) = RGB(0, 0, 255)
.ElementType(0) = 1
'Generate data to plot
Pi = 3.14
For u = 0 To 2 * Pi Step 0.1
For v = 0 To 2 * Pi Step 0.1
Bx = 6 * Cos(u) * (1 + Sin(u))
By = 16 * Sin(u)
rad = 4 * (1 - Cos(u) / 2)
If Pi < u And u <= 2 * Pi Then
x = Bx + rad * Cos(v + Pi)
Else
x = Bx + rad * Cos(u) * Cos(v)
End If
If Pi < u And u <= 2 * Pi Then
y = By
Else
y = By + rad * Sin(u) * Cos(v)
End If
z = rad * Sin(v)
.PlotXYZ x, y, z, 0
Next
Next
.AutoRange
End With
End Sub
' radio buttons to select tracking mode
Private Sub radTrackModeLock_Click()
NTGraph3D.TrackMode = 0 ' Lock
End Sub
Private Sub radTrackModeZoom_Click()
NTGraph3D.TrackMode = 1 ' Zoom
End Sub
Private Sub radTrackModeRotate_Click()
NTGraph3D.TrackMode = 2 ' Rotate
End Sub
Private Sub radTrackModePan_Click()
NTGraph3D.TrackMode = 3 ' Pan
End Sub
'----------------------------------------------------
If you don't really care about OpenGL and just need to plot something that looks 3D,
here is simple alternative. this code uses just series of lines drawn on a form
or Picturebox to present sort of landscape.
i don't recall where i saw the original code but here is modified version.
it allows simple scale and rotation of the plot.
Option Explicit
' based on some code sample from web, don't recall URL
Const PI = 3.14159265
Dim byaLandscape(800, 255) As Integer ' can be single as well as long as DrawLandscape datasource type is changed too
'Direct draw onto a form or picture box
Private Sub DrawLandscape(disp As Object, datasource() As Integer, PosX As Integer, PosY As Integer, TiltX As Single, TiltY As Single, XYRatio As Single, XYScale As Single)
Dim X As Integer, Y As Integer, Xplot As Integer, Yplot As Integer, yOffset As Single
disp.Cls
disp.AutoRedraw = True
disp.ScaleMode = 3 '3 = Pixels
For Y = UBound(datasource, 2) To LBound(datasource, 2) Step -1
yOffset = Y - 0.5 * UBound(datasource, 2)
For X = LBound(datasource, 1) To UBound(datasource, 1)
Xplot = PosX + CInt(XYScale * (XYRatio * X - TiltX * yOffset))
Yplot = PosY + 0.5 * UBound(datasource, 2) - CInt(XYScale * TiltY * yOffset)
If datasource(X, Y) <> 0 Then
disp.Line (Xplot, Yplot)-(Xplot, Yplot - datasource(X, Y)), RGB(Y * (255 / UBound(datasource, 2)), _
255 - (Y * (255 / UBound(datasource, 2))), _
X * (255 / UBound(datasource, 1)))
End If
Next
Next
End Sub
Private Sub Command1_Click()
' DrawLandscape Picture1, byaLandscape, CInt(Me.Text1.Text), CInt(Me.Text2.Text), Val(Me.Text3.Text), Val(Me.Text4.Text), Val(Me.Text5.Text), Val(Me.Text6.Text)
DrawLandscape Me, byaLandscape, CInt(Me.Text1.Text), CInt(Me.Text2.Text), Val(Me.Text3.Text), Val(Me.Text4.Text), Val(Me.Text5.Text), Val(Me.Text6.Text)
End Sub
Private Sub Form_Load()
'This will create data a sort of wavy landscape
Dim X As Integer, Y As Integer
For X = LBound(byaLandscape, 1) To UBound(byaLandscape, 1)
For Y = LBound(byaLandscape, 2) To UBound(byaLandscape, 2)
byaLandscape(X, Y) = 48 + (Sin((X + Y) * PI / 127) * Sin(Y * PI / 127)) * 32
Next
Next
End Sub
|
|
|
|

|
for the last code sample, just add button and six textboxes.
add label next to each text box and set values as follows:
textNo / label.caption / textbox value
1 / X / 250
2 / Y / 150
3 / dX / 0.5
4 / dY / 0.5
5 / xyRatio / 0.5
6 / xyScale / 1.0
|
|
|
|

|
Hi!
Could you write some examples how to use this library in my С# -project?Thx for help!
|
|
|
|

|
Add NTGraph3D.dll in References. Then add control from COM components in toolbox. And use =)
|
|
|
|
 |
|
|
General News Suggestion Question Bug Answer Joke Rant Admin
|
An ATL/STL ActiveX control based on OpenGL library for 3D data visualization
| Type | Article |
| Licence | |
| First Posted | 15 Jun 2003 |
| Views | 431,271 |
| Bookmarked | 255 times |
|
|