Home » Other » Training & Certification » help with new member function
help with new member function [message #288708] |
Tue, 18 December 2007 07:01 |
verd
Messages: 17 Registered: December 2007
|
Junior Member |
|
|
hey guys, i'll try and explain this as best as i can, here goes...
Okay so basically what we’re trying to do here is compare two polygon sets. Remember that a polygon is a shape with many sides and corners. So for example one polygon can have four corners. So the co-ordinates for example maybe, 2, 2 3,5 5,5 and 5,6 whilst polygon two would be 2,3 3,5 6,5 and 3,2.
What we want to do is compare each corner of each polygon. In the instance that a corner does or doesn’t match, return 1 for true and 0 for false.
So far here is the header and body created for a corner and the polygon part follows. Below is a second member function in polygon to compare the corners, which i need to complete. I’ll write more about what i’ve accomplished in a few minutes.
create or replace type corner as object
( xval number,
yval number,
member function X return number,
member function Y return number,
member function CornerDistance(aCorner Corner ) return number
)
/
--create corner as body
create or replace type body corner as
member function X return number is
begin
return xval;
end;
member function Y return number is
begin
return yval;
end;
member function CornerDistance(aCorner Corner) return number is
Distance number;
begin
Distance := sqrt((self.x - aCorner.x)**2 + (self.y - aCorner.y)**2);
return Distance;
end;
end;
/
--varray for collection of corners
create or replace type CollectionOfCorners as varray(20) of Corner;
/
create or replace type polygon as object
(
listOfCorners CollectionOfCorners,
member function PerimeterOfPolygon return number,
member function compareCornerCollection return number
);
/
create or replace type body polygon as
member function PerimeterOfPolygon return number is
TotalOfPolygonPerimeter number;
begin
TotalOfPolygonPerimeter :=0;
for I in listOfCorners.first..listOfCorners.last
loop
if I < listOfCorners.last then
TotalOfPolygonPerimeter := TotalOfPolygonPerimeter + listOfCorners(I).CornerDistance(listOfCorners(listOfCorners.next(I)));
else
TotalOfPolygonPerimeter := TotalOfPolygonPerimeter + listOfCorners(I).CornerDistance(listOfCorners(listOfCorners.first));
end if;
end loop;
return TotalOfPolygonPerimeter;
end;
my question is i'm not too sure as to how to go about making the second member function for the polygon to compare the two polygons against each other.
there is a skeleton structure of that member function which i'll post later on.
if anyone can shed some sort of light on this matter, i'll really appreciate it!
|
|
|
Re: help with new member function [message #288715 is a reply to message #288708] |
Tue, 18 December 2007 07:21 |
verd
Messages: 17 Registered: December 2007
|
Junior Member |
|
|
this is what the skeleton looks like of the new member function. i havent run it yet because there are items missing.
member function compareCornerCollection(polygon1 polygon, polygon2 polygon)
return number is
BGIN
For i in polygon1.first..polygon2.last
For i in polygon2.first..polygon2.last
If polygon1(i)x == polygon2.x(i) then
Return 1 – polygon comparison is true
Else
Return 0 --polygon comparison is false
End if;
End;
can anyone please shed some light on this!?!?!
|
|
|
|
|
|
|
|
|
|
|
Re: help with new member function [message #288750 is a reply to message #288735] |
Tue, 18 December 2007 10:08 |
verd
Messages: 17 Registered: December 2007
|
Junior Member |
|
|
Michel Cadot wrote on Tue, 18 December 2007 08:02 |
Quote: | i am totally confused!
|
So am I.
I really don't understand what you want.
Please "post a test case, an example of what you can have and what you want to execute and what you should get in this case"
Regards
Michel
|
okay, here goes...
this is what i have so far....
a polygon where i can calculate the perimeter from all the associated corners. this is split into two sections of code the first is the corner, the second is the polygon.
shown here in this code:
create or replace type corner as object
( xval number,
yval number,
member function X return number,
member function Y return number,
member function CornerDistance(aCorner Corner) return number
)
/
--create corner as body
create or replace type body corner as
member function X return number is
begin
return xval;
end;
member function Y return number is
begin
return yval;
end;
member function CornerDistance(aCorner Corner) return number is
Distance number;
begin
Distance := sqrt((self.x - aCorner.x)**2 + (self.y - aCorner.y)**2);
return Distance;
end;
end;
/
--here is an anonymouse block to test the code!
Declare
Corner1 corner := corner(10,10);
Corner2 corner := corner(20,20);
BEGIN
DBMS_OUTPUT.PUT_LINE('Distance between corners = '||
Corner1.CornerDistance(Corner2));
end;
/
okay so now we have the corners of the polygon and the distance calculated between each corner. now we need to calculated the perimeter of the whole polygon. this is done in the polygon object coding here:
--we need a varray because we have similar datatypes
create or replace type CollectionOfCorners as varray(20) of Corner;
/
--here is the polygon header and body
create or replace type polygon as object
(
listOfCorners CollectionOfCorners,
member function PerimeterOfPolygon return number
);
/
create or replace type body polygon as
member function PerimeterOfPolygon return number is
TotalOfPolygonPerimeter number;
begin
TotalOfPolygonPerimeter :=0;
for I in listOfCorners.first..listOfCorners.last
loop
if I < listOfCorners.last then
TotalOfPolygonPerimeter := TotalOfPolygonPerimeter + listOfCorners(I).CornerDistance(listOfCorners(listOfCorners.next(I)));
else
TotalOfPolygonPerimeter := TotalOfPolygonPerimeter + listOfCorners(I).CornerDistance(listOfCorners(listOfCorners.first));
end if;
end loop;
return TotalOfPolygonPerimeter;
end;
end;
/
--this is the anonymous block to test the polygon
declare
apolygon polygon := polygon(CollectionOfCorners(Corner(0,0), Corner(1,1),Corner(1,1)));
begin
dbms_output.put_line('the total perimeter is ' ||aPolygon.PerimeterOfPolygon());
end;
/
now my query is, how do i, compare two collections of corners!?
are you with me?
|
|
|
|
|
|
|
|
|
Re: help with new member function [message #288910 is a reply to message #288750] |
Wed, 19 December 2007 00:55 |
|
Barbara Boehmer
Messages: 9100 Registered: November 2002 Location: California, USA
|
Senior Member |
|
|
It is unclear what sort of output you want when you compare the polygons consisting of lists of corners. If you want the number of corners that match, then the following should do it. If you want something else, then you should be able to modify it to suit your needs.
MEMBER FUNCTION compareCornerCollection (polygon2 polygon) RETURN NUMBER IS
TotalMatchingCorners NUMBER;
BEGIN
TotalMatchingCorners := 0;
FOR i IN SELF.listofcorners.FIRST .. SELF.listofcorners.LAST LOOP
FOR j IN polygon2.listofcorners.FIRST .. polygon2.listofcorners.LAST LOOP
IF SELF.listofcorners(i).x = polygon2.listofcorners(j).x
AND SELF.listofcorners(i).y = polygon2.listofcorners(j).y THEN
TotalMatchingCorners := TotalMatchingCorners + 1;
END IF;
END LOOP;
END LOOP;
RETURN TotalMatchingCorners;
END;
Here is a demonstration incorporating it into the rest of your code:
SCOTT@orcl_11g> drop type polygon
2 /
Type dropped.
SCOTT@orcl_11g> drop type collectionofcorners
2 /
Type dropped.
SCOTT@orcl_11g> drop type corner
2 /
Type dropped.
SCOTT@orcl_11g>
SCOTT@orcl_11g> create or replace type corner as object
2 ( xval number,
3 yval number,
4 member function X return number,
5 member function Y return number,
6 member function CornerDistance(aCorner Corner) return number
7 )
8 /
Type created.
SCOTT@orcl_11g> create or replace type body corner as
2 member function X return number is
3 begin
4 return xval;
5 end;
6
7 member function Y return number is
8 begin
9 return yval;
10 end;
11
12 member function CornerDistance(aCorner Corner) return number is
13 Distance number;
14 begin
15 Distance := sqrt((self.x - aCorner.x)**2 + (self.y - aCorner.y)**2);
16 return Distance;
17 end;
18 end;
19 /
Type body created.
SCOTT@orcl_11g>
SCOTT@orcl_11g> Declare
2 Corner1 corner := corner(10,10);
3 Corner2 corner := corner(20,20);
4 BEGIN
5 DBMS_OUTPUT.PUT_LINE('Distance between corners = '||
6 Corner1.CornerDistance(Corner2));
7 end;
8 /
Distance between corners = 14.14213562373095048801688724209698078569
PL/SQL procedure successfully completed.
SCOTT@orcl_11g>
SCOTT@orcl_11g> create or replace type CollectionOfCorners as varray(20) of Corner;
2 /
Type created.
SCOTT@orcl_11g>
SCOTT@orcl_11g> create or replace type polygon as object
2 (
3 listOfCorners CollectionOfCorners,
4 member function PerimeterOfPolygon return number,
5 MEMBER FUNCTION compareCornerCollection (polygon2 polygon) RETURN NUMBER
6 );
7 /
Type created.
SCOTT@orcl_11g> show errors
No errors.
SCOTT@orcl_11g> create or replace type body polygon as
2 member function PerimeterOfPolygon return number is
3 TotalOfPolygonPerimeter number;
4
5 begin
6
7 TotalOfPolygonPerimeter :=0;
8 for I in listOfCorners.first..listOfCorners.last
9 loop
10 if I < listOfCorners.last then
11 TotalOfPolygonPerimeter := TotalOfPolygonPerimeter + listOfCorners(I).CornerDistance(listOfCorners(listOfCorners.next(I)));
12 else
13 TotalOfPolygonPerimeter := TotalOfPolygonPerimeter + listOfCorners(I).CornerDistance(listOfCorners(listOfCorners.first));
14 end if;
15 end loop;
16 return TotalOfPolygonPerimeter;
17 end;
18
19 MEMBER FUNCTION compareCornerCollection (polygon2 polygon) RETURN NUMBER IS
20 TotalMatchingCorners NUMBER;
21 BEGIN
22 TotalMatchingCorners := 0;
23 FOR i IN SELF.listofcorners.FIRST .. SELF.listofcorners.LAST LOOP
24 FOR j IN polygon2.listofcorners.FIRST .. polygon2.listofcorners.LAST LOOP
25 IF SELF.listofcorners(i).x = polygon2.listofcorners(j).x
26 AND SELF.listofcorners(i).y = polygon2.listofcorners(j).y THEN
27 TotalMatchingCorners := TotalMatchingCorners + 1;
28 END IF;
29 END LOOP;
30 END LOOP;
31 RETURN TotalMatchingCorners;
32 END;
33
34 end;
35 /
Type body created.
SCOTT@orcl_11g> show errors
No errors.
SCOTT@orcl_11g> declare
2 apolygon polygon := polygon(CollectionOfCorners(Corner(0,0), Corner(1,1),Corner(1,1)));
3 begin
4 dbms_output.put_line('the total perimeter is ' ||aPolygon.PerimeterOfPolygon());
5 end;
6 /
the total perimeter is 2.82842712474619009760337744841939615714
PL/SQL procedure successfully completed.
SCOTT@orcl_11g> DECLARE
2 polygona polygon := polygon(CollectionOfCorners(Corner(2,2), Corner(3,5),Corner(5,5), Corner(5,6)));
3 polygonb polygon := polygon(CollectionOfCorners(Corner(2,3), Corner(3,5),Corner(6,5), Corner(3,2)));
4 BEGIN
5 DBMS_OUTPUT.PUT_LINE ('total matching corners: ' || polygona.compareCornerCollection(polygonb));
6 END;
7 /
total matching corners: 1
PL/SQL procedure successfully completed.
SCOTT@orcl_11g> DECLARE
2 polygona polygon := polygon(CollectionOfCorners(Corner(2,2), Corner(3,5),Corner(5,5), Corner(5,6)));
3 polygonb polygon := polygon(CollectionOfCorners(Corner(2,2), Corner(3,5),Corner(6,5), Corner(3,2)));
4 BEGIN
5 DBMS_OUTPUT.PUT_LINE ('total matching corners: ' || polygona.compareCornerCollection(polygonb));
6 END;
7 /
total matching corners: 2
PL/SQL procedure successfully completed.
SCOTT@orcl_11g>
|
|
|
Re: help with new member function [message #289056 is a reply to message #288910] |
Wed, 19 December 2007 06:38 |
verd
Messages: 17 Registered: December 2007
|
Junior Member |
|
|
Barbara Boehmer wrote on Wed, 19 December 2007 00:55 | It is unclear what sort of output you want when you compare the polygons consisting of lists of corners. If you want the number of corners that match, then the following should do it. If you want something else, then you should be able to modify it to suit your needs.
...
|
wow, that response was overwhelming, thank you! i was reading till late last night on what to do etc. i shall be back later to put some sort of a response on here, to clarify things further. thank you ever so much for your reply barbara i really appreciate it!
[Edit MC: remove the whole Barbara post copy]
[Updated on: Wed, 19 December 2007 06:42] by Moderator Report message to a moderator
|
|
|
Re: help with new member function [message #289097 is a reply to message #288708] |
Wed, 19 December 2007 12:43 |
verd
Messages: 17 Registered: December 2007
|
Junior Member |
|
|
hey guys, i've been working on this for a good few hours now. it's more clear to me what i have to do. i think i'll have to let my tutor know that i posted on here for help as i really dont want to be classified as a plagiarist.
anyway i may be back later to show you what i've done!
|
|
|
|
Re: help with new member function [message #289292 is a reply to message #289120] |
Thu, 20 December 2007 10:20 |
verd
Messages: 17 Registered: December 2007
|
Junior Member |
|
|
Barbara Boehmer wrote on Wed, 19 December 2007 14:30 |
verd wrote on Wed, 19 December 2007 10:43 | i think i'll have to let my tutor know that i posted on here for help as i really dont want to be classified as a plagiarist.
|
Oops, I didn't realize this was homework or I would have given you hints and links to documentation and such, instead of complete code. I will move this from newbies to homework. In the future, please post homework in the homework forum.
|
Thanks Barbara! Well, I'm a newbie here and didn't know which board to post in! I didn't even see the other board!!!! Also, I haven't copied your code word for word. AND I've been reading up on IF statements! Plus I have a better sense of direction for the second part of the assignment!
Anyway, your coding really helped me out. I've managed to make sense of my code on paper, but I need to run it to see what happens. God I felt so lazy today, really didn't feel like doing anything at all. I shall be posting here soon, to let you guys know how I get along!
Many thanks once again!
|
|
|
Goto Forum:
Current Time: Thu Nov 21 14:00:52 CST 2024
|