What Have You Done Today - (Computer Version)

  • Thread starter tlowr4
  • 4,208 comments
  • 287,295 views
Upgraded my graphics card today.
Zs4Iq3H.jpg


On the left is the new GT 740 SuperClocked from EVGA, and on the right is my old GT 720. The latter of which is now in my brother's PC, since he was running a Radeon HD 8370D (integrated) previously.

THrOwOa.jpg

Updated:

Using Nvidia's "adaptive" power mode. The thing goes all the way down to 320MHz when web browsing/idling, and temps have yet to exceed 75C when stress-testing.

Passmark scores were ~790 on my GT 720. With stock speeds, my GT 740 scored around 1160. I boosted the clocks quite a bit and am now getting around 1655. I don't plan on pushing it any further considering the relatively small cooler.

As for games, being able to play Dirt 3 @ 1080p with almost every setting on high (while maintaining 60fps!) is fantastic. A lot of other games also saw the jump from 720p to 900p/1080p. Color me pleased, especially since I got this card for just $50 from a friend of mine.
sWIZzSi.png


 
Last edited:
Fixed up one of my first laptops, a Dell Latitude LS. Put the right date in the Bios (it was January 1st, 1988), then we went from there. At first it said Operating System not found but a quick (but slow) restart fixed that by disconnecting it from the dock and putting it by it self. After that I saw the sweet loading bar of Windows 2000 Professional! I got that feeling when you build a computer and it lives, but this felt much better. But this was all yesterday. Today I put the PCI Belkin Wireless Card in to get some WiFi. Booted up Firefox 10 and Yahoo! loaded. Might play around some more tomorrow though. :P
 
Removed one of the servers from my environment recently and redid my network there after. Went from two networks to one, and have all gigabyte routers and switches now. got one more cable to add for the bedroom, and some tweaks to the wifi. Got 4 more 146gig, 15krpm SAS drives installed, bringing the count up to 6.
Hopefully Monday the 1070 and mechanical keyboard will be arriving for the gaming machine. Once that comes in will be tearing down the PC for a thorough cleaning and case painting to match the blue and white theme I am doing.
 
Found out what was causing an annoying rattling sound from my case. It turned out to be a clip for one of the empty hard drive brackets, I just put some tape over it and it seems to have stopped the rattling.
 
They've made it! Time to get to work.
IMG_20160821_122404327.jpg


Edit: VR is VERY much better now. No issues playing war thunder or elite:dangerous. Next up will be getting my peddles figured out for the g27 and hope that pcars doesn't make me nearly puke like last time.
 
Last edited:
Found out what was causing an annoying rattling sound from my case. It turned out to be a clip for one of the empty hard drive brackets, I just put some tape over it and it seems to have stopped the rattling.

What case? I had the same with my old Fractal Design Define R3. I bent the tab outwards so it was pushed against the hard drive cage with more force and it stopped, then I removed all the caddies I wasn't using because it never occurred to me to actually do that.

Since I decided against ordering a 1060 this month (but might next month, if my overtime pay is as high as I'm hoping it'll be) I ordered another 8GB of RAM to bring it up to 16GB - mainly so I can try Just Cause 3 again to see if it'll run even remotely well, but also because I had an itch to buy anything for my PC and more RAM can't hurt - and a few sundries to simplify my wheel stand setup so that I might actually use it, namely a wireless Logitech keyboard and trackpad combo, a 4-plug extension lead to replace the 2-plug one I have under the sofa, a USB extension cable, some velcro cable ties and... I think that's all.

I was going to buy a mic too but a) I don't want a headset because I already get laughed at enough by my other half (and I really like the headphones I have) and b) table mics almost universally look ridiculous. What's wrong with having a small, nondescript black box? Why do I have to choose between one that looks like a somewhat anaemic romantic aid or one that looks like it may have come from a Happy Meal in the mid '90s? So anyway I'm going to build my own, again. This time I'll actually solder it (instead of having it sitting on a breadboard) and use a few values of bypass cap for more effective power supply noise suppression so I can power it via USB.
 
What case? I had the same with my old Fractal Design Define R3. I bent the tab outwards so it was pushed against the hard drive cage with more force and it stopped, then I removed all the caddies I wasn't using because it never occurred to me to actually do that.
It's a Deepcool Tesseract, I just realised that it was the clip for one of the 5.25 inch drive bays, not the empty hard drive caddies.
 
Whew, that was a royal pain in the arse...

So my friend mailed me my old computer. I attempted to merge it with my new computer... old computer had better CPU/Mobo, new computer had better graphics cards. It did not go anywhere near as easily as it should've. Long story short, could not get the damn thing to post. Fans would just kick on for a split second then shut off. Tried a bunch of different things... removing RAM, graphics cards, swapping PSUs, etc.

Eventually I had it stripped it down to a PSU, mobo & cpu on a test bench. Still doesn't post. Swap power supply. No post. At this point I'm getting desperate. Maybe the power cables I'm using for the mobo/CPU are faulty? I swap the CPU cable. Finally, it posts!

Next, I add a GPU. Still posts.

Then I add my boot drive... Doesn't post anymore. Hmm, bad drive? So I remove the drive and add a different drive. Still no post. What the heck!?

Getting increasingly desperate, I remove the drives and turn it on. Okay, posts... so I try plugging in a drive. Unposted.

Hmm, I'm using the SATA power cable from the other PSU... now that I think of it, the CPU power cable I swapped out was from the other PSU as well... could it be...?

I swap the SATA power cable out for one I knew was from the PSU I was using, and...





...It posts. Apparently my two PSUs were just allergic to each other's cables the whole damn time.
 
Wow Fox, that mobo looks old. What's the plans for it?

The mobo is old.

It is a P5Q Pro Turbo P45/ICH10 chipset
intel E6420 @ 2.13Ghz
Team DDR2 1066Mhz
GT710 1GB

Turn it into a HTPC or give it to my nephews for Xmas so they can play minecraft(if their mother allows it) on it.

The thing was from my old gaming rig and was still working so why not do something useful with it.
 
Hmm.

Ran Time Spy benchmarks. Lots of artifacting. Crap, could one of my 780Ti's be on the fritz? I mean, I haven't really used them very heavily (Maybe 200 hours total of intensive gameplay), drivers are up to date and I don't have them overclocked... But then again, my case is kinda cramped and doesn't have the best ventilation.

Hmm.

Installed a bunch of Windows 10 updates. Like, from around December till now's worth. Re-ran Time Spy. No more artifacting.

Hmm.
 
I'm building a Python application to help design students understand two-point perspective (What happens when you move or rotate an object? What happens when you move the vanishing points?).

So to begin with I'm building a theoretical 3D engine in Excel :D

Here's a graph visualizing how to transform the coordinates of an object (the square) to screen coordinates. By each corner of the square you can see the x and y coordinates. The tilted numbers at the bottom are the converted screen coordinates for the x axis.

persp_graph.png


And here are some of the controls, that allows me to change the size of the square, move it and rotate it. I can also change the uPos variable to change the field of view:

persp_cont.png
 
that's some good stuff eran. I need to get around to getting back into Python, my RPi and html/web design as well.
 
Last edited:
Out of bordom.
I decided to overclock the GT710 GPU in the HTPC rig.

Base Clock is 950Mhz with a furmark score of 410 frames rendered in 60seconds.
Current clock is 1110Mhz with a furmark score of 425 frames rendered in 60seconds
Tests were done using no AA and 1280x720 res on GPU burner v2 furry PQtorus

Seems I get 5 frames more for every 50Mhz, and quite surprising to get this low end card to such a high clock.
Unless these low end cards are just underclocked heavily.
 
Recently made a cheap and minor upgrade from stock 8gb 1333Hz RAM to Kingston HyperX FURY 16GB 1600MHz DDR3 my Intel Core i5 3470, GTX 970 EVGA FTW running Win 10 @ 2560x1080 which freed up my CPU usage percentage by 35-45% in most games. Games like Assetto Corsa, Hitman, Far Cry 4, Dirt Rally were some of the games tested. There's long sketisim amongst people with RAM upgrades but it's done my system tremendously well.

Framerate also averages much more consistently and smaller deviation when using in-game benchmarks. Not sure why such improvements but I'm seriously thinking that the increasing the RAM have set my system free :P
 
The Python script for the two-point perspective application is done!

Here you can see it in action:



Code:
from tkinter import *
import math

unitScale = 100

class Cube():
    def __init__(self, canvas):
        self.canvas = canvas
        self.canvasWidth=800
        self.canvasHeight = 500
        self.cubePos = {'x':0, 'y':0, 'z':0}
        self.cubeSize = 0.5
        self.cubeRadius = None

        self.zrot = 0
        self.sin = None
        self.cos = None

        self.vertices = {'a':[0, 0], #cube coordinates in 3D space: [x, y]
                         'b':[0, 0],
                         'c':[0, 0],
                         'd':[0, 0],
                         'z':[0, 0]} #[z0, z1] for all vertices

        self.uPos = -3
        self.vanishingPoints = [0, 0] #[x1, x2]

        self.pVertices = {'a0':[0, 0], #picturePlance vertices: [x, y]
                          'b0':[0, 0],
                          'c0':[0, 0],
                          'd0':[0, 0],
                          'a1':[0, 0],
                          'b1':[0, 0],
                          'c1':[0, 0],
                          'd1':[0, 0]}

        #keybinds
        self.canvas.bind("<ButtonPress-1>", self.KeyButtonPress)
        self.canvas.bind("<ButtonRelease-1>", self.KeyButtonRelease)
        self.canvas.bind("<B1-Motion>", self.KeyOnMotion)
        self.canvas.bind("<Shift-B1-Motion>", self.KeyShiftOnMotion)
        self.canvas.bind("<Control-B1-Motion>", self.KeyControlOnMotion)
        self.canvas.bind("<Alt-B1-Motion>", self.KeyAltOnMotion)
        self.canvas.bind('<Configure>', self.resize)

        self._drag_data = [0, 0] #[x, y]
        
        self.refresh()

    def KeyButtonPress(self, event):
        '''Begin drag of the cube'''
        self._drag_data = [event.x, event.y]

    def KeyButtonRelease(self, event):
        self._drag_data = [0, 0]

    def KeyOnMotion(self, event):
        global unitScale
        delta_x = event.x - self._drag_data[0]
        delta_y = event.y - self._drag_data[1]

        self.cubePos['x'] += delta_x/unitScale
        self.cubePos['z'] += delta_y/unitScale
        self.refresh()

        self._drag_data = [event.x, event.y]

    def KeyShiftOnMotion(self, event):
        delta_x = event.x - self._drag_data[0]
        self.zrot += delta_x * 0.2
        self.refresh()

        self._drag_data = [event.x, event.y]

    def KeyControlOnMotion(self, event):
        delta_y = event.y - self._drag_data[1]
        self.uPos += delta_y * -0.01*self.uPos
        self.refresh()

        self._drag_data = [event.x, event.y]

    def KeyAltOnMotion(self, event):
        delta_x = event.x - self._drag_data[0]
        delta_y = event.y - self._drag_data[1]
        delta = delta_x + delta_y
        
        self.cubeSize += delta * 0.01*self.cubeSize
        self.refresh()

        self._drag_data = [event.x, event.y]

    def draw(self):
        def drawCube(self):
            keys = ['a', 'b', 'c', 'd']
            for i in range(0,4):
                coords = self.pVertices[keys[i]+'0']
                coords += self.pVertices[keys[i-1]+'0']
                coords += self.pVertices[keys[i-1]+'1']
                coords += self.pVertices[keys[i]+'1']

                self.canvas.create_polygon(coords,tags = 'cube', width=1,
                                           fill='', outline='#000000')

        def drawVanishingPoints(self):
            global unitScale
            vp1 = [self.vanishingPoints[0]*unitScale, 0]
            vp2 = [self.vanishingPoints[1]*unitScale, 0]
            b0 = self.pVertices['b0']
            b1 = self.pVertices['b1']
            c0 = self.pVertices['c0']
            c1 = self.pVertices['c1']
            d0 = self.pVertices['d0']
            d1 = self.pVertices['d1']
            vpColor = '#aaaaaa'

            line1 = vp1+d0+d1
            line2 = vp2+b0+b1
            line3 = vp1+c0+vp2+c1

            self.canvas.create_polygon(line1, tags='vp', dash=(2, 1),
                                       fill='', outline=vpColor)
            self.canvas.create_polygon(line2, tags='vp', dash=(2, 1),
                                       fill='', outline=vpColor)
            self.canvas.create_polygon(line3, tags='vp', dash=(2, 1),
                                       fill='', outline=vpColor)

        self.canvas.delete('cube')
        self.canvas.delete('vp')
        drawVanishingPoints(self)
        drawCube(self)

    def picturePlaneVerticesCoords(self):
        global unitScale
        uPos = self.uPos
        
        for key1 in ['a', 'b', 'c', 'd']:
            x = self.vertices[key1][0]
            y = self.vertices[key1][1]
            for n in ['0', '1']:
                z = self.vertices['z'][int(n)]
                key2 = key1+n
                ppx = (x-x/(y-uPos)*y)*unitScale
                ppy = (z-z/(y-uPos)*y)*unitScale
                self.pVertices[key2] = [ppx, ppy]

    def printCoords(self):
        print('Cube coordinates:')
        for key, value in sorted(self.vertices.items()):
            print(key, value)
        print('Screen coordinates:')
        for key, value in sorted(self.pVertices.items()):
            print(key, value)

    def refresh(self):
        self.cubePosChange()
        self.cubeSizeChange()
        self.uPosChange()
        self.zrotChange()
        self.verticesCoords()
        self.vanishingPointCoords()
        self.picturePlaneVerticesCoords()
        
        self.draw()

    def resize(self, event):
        w,h = event.width, event.height
        self.canvasWidth = w
        self.canvasHeight = h
        self.canvas.config(scrollregion=(-w/2,-h/2,w/2,h/2))

    def vanishingPointCoords(self):
        '''Sets coordinates for vanishing points'''
        vp1Rot = self.zrot-45
        vp1Tan = math.tan(math.radians(vp1Rot))
        vp2Rot = self.zrot+45
        vp2Tan = math.tan(math.radians(vp2Rot))

        vp1 = 0-self.uPos*vp1Tan
        vp2 = 0-self.uPos*vp2Tan
        self.vanishingPoints = [vp1, vp2]
        
    def verticesCoords(self):
        '''Sets coordinates for cube vertices'''
        x = self.cubePos['x']
        y = self.cubePos['y']
        z = self.cubePos['z']
        s = self.cubeSize
        r = self.cubeRadius
        sin = self.sin
        cos = self.cos
        
        self.vertices['a'][0] = x-r*sin
        self.vertices['b'][0] = x+r*cos
        self.vertices['c'][0] = x+r*sin
        self.vertices['d'][0] = x-r*cos

        a = y-r*cos
        b = y-r*sin
        c = y+r*cos
        d = y+r*sin
        yOffset = min([a, b, c, d])
        
        self.vertices['a'][1] = a-yOffset
        self.vertices['b'][1] = b-yOffset
        self.vertices['c'][1] = c-yOffset
        self.vertices['d'][1] = d-yOffset

        self.vertices['z'] = [z+s, z-s]

    def cubePosChange(self):
        global unitScale
        xlim = self.canvasWidth/(2*unitScale)
        zlim = self.canvasHeight/(2*unitScale)
        if self.cubePos['x'] < -xlim:
            self.cubePos['x'] = -xlim
        elif self.cubePos['x'] > xlim:
            self.cubePos['x'] = xlim

        if self.cubePos['z'] < -zlim:
            self.cubePos['z'] = -zlim
        elif self.cubePos['z'] > zlim:
            self.cubePos['z'] = zlim
        
    def cubeSizeChange(self):
        self.cubeRadius = (2*self.cubeSize**2)**0.5

    def uPosChange(self):
        uPosLim = (-0.05, -10)
        if self.uPos < uPosLim[1]:
            self.uPos = uPosLim[1]
        elif self.uPos > uPosLim[0]:
            self.uPos = uPosLim[0]
        
    def zrotChange(self):
        rotlim = 45 #rotation limit
        if self.zrot > rotlim:
            self.zrot -= rotlim*2
        elif self.zrot < -rotlim:
            self.zrot += rotlim*2
        self.sin = math.sin(math.radians(self.zrot))
        self.cos = math.cos(math.radians(self.zrot))
        
master = Tk()

w = Canvas(master, width=800, height = 500, bg='#ffffff')
w.pack(expand=TRUE, fill=BOTH)
w.config(scrollregion=(-400,-250,400,250))
w.create_line(-1000, 0, 1000, 0, fill='#40cff0') #horizon

C = Cube(w)

mainloop()
 
Last edited:
Still overclocking that GT710 as I am still bored, Current Clock 1250Mhz.

It is sad that this thing has a higher clock than my GTX680SC, even if it is slow as a wet week.
 
I decided to get rid of Windows 10 and move to Linux. Though I plan to set up a virtual machine at some point, for whatever Wine can't handle. I got a distribution called LXLE, which is an Ubuntu/Lubuntu derivative that uses LXDE.
Screenshot at 2016-09-01 19:57:39.png

This isn't actually the standard look, I just decided to for all black.
 
So I swapped out the power supply for my desktop PC. It had a Rosewill Hive 750w Bronze before, and now it has an EVGA Supernova G2 750 W Gold. Mainly the reason for me doing this is that the Rosewill's main fans are pretty loud, even if it's not loaded.

I thought it would have taken me a while to change out the power supply, but it only took 10-15 minutes. Guess my cable management turned out much better than I thought when I first built the PC. Now, after running it for a day or so, testing it out with games, it holds up better than the Rosewill. It has an ECO mode, which apparently reduces fan noise at low to moderate power loads. I barely touch the limits of this power supply, so I enabled it, and my system as a whole became significantly quieter. I also tried a bit of overclocking, and it seems that my 1070 is able to hold a higher clock speed than when I had the Rosewill. Interesting...
 
The Python script for the two-point perspective application is done!

Lovely stuff and a great tkinter demonstration!:)👍 I just could not help but to add a little friend...
Code:
from tkinter import *
import math

unitScale = 100

class Cube():
    def __init__(self, canvas):
        self.canvas = canvas
        self.canvasWidth=800
        self.canvasHeight = 500
        self.cubePos = {'x':0, 'y':0, 'z':0}
        self.cubeSize = 0.5
        self.cubeRadius = None

        self.zrot = 0
        self.sin = None
        self.cos = None

        self.vertices = {'a':[0, 0], #cube coordinates in 3D space: [x, y]
                         'b':[0, 0],
                         'c':[0, 0],
                         'd':[0, 0],
                         'z':[0, 0]} #[z0, z1] for all vertices

        self.uPos = -3
        self.vanishingPoints = [0, 0] #[x1, x2]

        self.pVertices = {'a0':[0, 0], #picturePlance vertices: [x, y]
                          'b0':[0, 0],
                          'c0':[0, 0],
                          'd0':[0, 0],
                          'a1':[0, 0],
                          'b1':[0, 0],
                          'c1':[0, 0],
                          'd1':[0, 0]}

        #keybinds
        self.canvas.bind("<ButtonPress-1>", self.KeyButtonPress)
        self.canvas.bind("<ButtonRelease-1>", self.KeyButtonRelease)
        self.canvas.bind("<B1-Motion>", self.KeyOnMotion)
        self.canvas.bind("<Shift-B1-Motion>", self.KeyShiftOnMotion)
        self.canvas.bind("<Control-B1-Motion>", self.KeyControlOnMotion)
        self.canvas.bind("<Alt-B1-Motion>", self.KeyAltOnMotion)
        self.canvas.bind('<Configure>', self.resize)

        self._drag_data = [0, 0] #[x, y]
        
        self.refresh()

    def KeyButtonPress(self, event):
        '''Begin drag of the cube'''
        self._drag_data = [event.x, event.y]

    def KeyButtonRelease(self, event):
        self._drag_data = [0, 0]

    def KeyOnMotion(self, event):
        global unitScale
        delta_x = event.x - self._drag_data[0]
        delta_y = event.y - self._drag_data[1]

        self.cubePos['x'] += delta_x/unitScale
        self.cubePos['z'] += delta_y/unitScale
        self.refresh()

        self._drag_data = [event.x, event.y]

    def KeyShiftOnMotion(self, event):
        delta_x = event.x - self._drag_data[0]
        self.zrot += delta_x * 0.2
        self.refresh()

        self._drag_data = [event.x, event.y]

    def KeyControlOnMotion(self, event):
        delta_y = event.y - self._drag_data[1]
        self.uPos += delta_y * -0.01*self.uPos
        self.refresh()

        self._drag_data = [event.x, event.y]

    def KeyAltOnMotion(self, event):
        delta_x = event.x - self._drag_data[0]
        delta_y = event.y - self._drag_data[1]
        delta = delta_x + delta_y
        
        self.cubeSize += delta * 0.01*self.cubeSize
        self.refresh()

        self._drag_data = [event.x, event.y]

    def draw(self):
        def drawCube(self):
            keys = ['a', 'b', 'c', 'd']
            for i in range(0,4):
                coords = self.pVertices[keys[i]+'0']
                coords += self.pVertices[keys[i-1]+'0']
                coords += self.pVertices[keys[i-1]+'1']
                coords += self.pVertices[keys[i]+'1']

                self.canvas.create_polygon(coords,tags = 'cube', width=1,
                                           fill='', outline='#000000')

        def drawVanishingPoints(self):
            global unitScale
            vp1 = [self.vanishingPoints[0]*unitScale, 0]
            vp2 = [self.vanishingPoints[1]*unitScale, 0]
            b0 = self.pVertices['b0']
            b1 = self.pVertices['b1']
            c0 = self.pVertices['c0']
            c1 = self.pVertices['c1']
            d0 = self.pVertices['d0']
            d1 = self.pVertices['d1']
            vpColor = '#aaaaaa'

            line1 = vp1+d0+d1
            line2 = vp2+b0+b1
            line3 = vp1+c0+vp2+c1

            self.canvas.create_polygon(line1, tags='vp', dash=(2, 1),
                                       fill='', outline=vpColor)
            self.canvas.create_polygon(line2, tags='vp', dash=(2, 1),
                                       fill='', outline=vpColor)
            self.canvas.create_polygon(line3, tags='vp', dash=(2, 1),
                                       fill='', outline=vpColor)

        self.canvas.delete('cube')
        self.canvas.delete('vp')
        drawVanishingPoints(self)
        drawCube(self)

        self.canvas.delete('lpup')
        self.canvas.delete('rpup')

        ex = self.cubePos['x']*3
        eu = (-10-self.uPos)
                
        w.create_arc(-150+ex-eu,-55,-100+ex-eu,-105,extent=180,tags='lpup',fill='#000000')
        w.create_arc( 100+ex+eu,-55, 150+ex+eu,-105,extent=180,tags='rpup',fill='#000000')

    def picturePlaneVerticesCoords(self):
        global unitScale
        uPos = self.uPos
        
        for key1 in ['a', 'b', 'c', 'd']:
            x = self.vertices[key1][0]
            y = self.vertices[key1][1]
            for n in ['0', '1']:
                z = self.vertices['z'][int(n)]
                key2 = key1+n
                ppx = (x-x/(y-uPos)*y)*unitScale
                ppy = (z-z/(y-uPos)*y)*unitScale
                self.pVertices[key2] = [ppx, ppy]

    def printCoords(self):
        print('Cube coordinates:')
        for key, value in sorted(self.vertices.items()):
            print(key, value)
        print('Screen coordinates:')
        for key, value in sorted(self.pVertices.items()):
            print(key, value)

    def refresh(self):
        self.cubePosChange()
        self.cubeSizeChange()
        self.uPosChange()
        self.zrotChange()
        self.verticesCoords()
        self.vanishingPointCoords()
        self.picturePlaneVerticesCoords()
        
        self.draw()

    def resize(self, event):
        w,h = event.width, event.height
        self.canvasWidth = w
        self.canvasHeight = h
        self.canvas.config(scrollregion=(-w/2,-h/2,w/2,h/2))

    def vanishingPointCoords(self):
        '''Sets coordinates for vanishing points'''
        vp1Rot = self.zrot-45
        vp1Tan = math.tan(math.radians(vp1Rot))
        vp2Rot = self.zrot+45
        vp2Tan = math.tan(math.radians(vp2Rot))

        vp1 = 0-self.uPos*vp1Tan
        vp2 = 0-self.uPos*vp2Tan
        self.vanishingPoints = [vp1, vp2]
        
    def verticesCoords(self):
        '''Sets coordinates for cube vertices'''
        x = self.cubePos['x']
        y = self.cubePos['y']
        z = self.cubePos['z']
        s = self.cubeSize
        r = self.cubeRadius
        sin = self.sin
        cos = self.cos
        
        self.vertices['a'][0] = x-r*sin
        self.vertices['b'][0] = x+r*cos
        self.vertices['c'][0] = x+r*sin
        self.vertices['d'][0] = x-r*cos

        a = y-r*cos
        b = y-r*sin
        c = y+r*cos
        d = y+r*sin
        yOffset = min([a, b, c, d])
        
        self.vertices['a'][1] = a-yOffset
        self.vertices['b'][1] = b-yOffset
        self.vertices['c'][1] = c-yOffset
        self.vertices['d'][1] = d-yOffset

        self.vertices['z'] = [z+s, z-s]

    def cubePosChange(self):
        global unitScale
        xlim = self.canvasWidth/(2*unitScale)
        zlim = self.canvasHeight/(2*unitScale)
        if self.cubePos['x'] < -xlim:
            self.cubePos['x'] = -xlim
        elif self.cubePos['x'] > xlim:
            self.cubePos['x'] = xlim

        if self.cubePos['z'] < -zlim:
            self.cubePos['z'] = -zlim
        elif self.cubePos['z'] > zlim:
            self.cubePos['z'] = zlim
        
    def cubeSizeChange(self):
        self.cubeRadius = (2*self.cubeSize**2)**0.5

    def uPosChange(self):
        uPosLim = (-0.05, -10)
        if self.uPos < uPosLim[1]:
            self.uPos = uPosLim[1]
        elif self.uPos > uPosLim[0]:
            self.uPos = uPosLim[0]
        
    def zrotChange(self):
        rotlim = 45 #rotation limit
        if self.zrot > rotlim:
            self.zrot -= rotlim*2
        elif self.zrot < -rotlim:
            self.zrot += rotlim*2
        self.sin = math.sin(math.radians(self.zrot))
        self.cos = math.cos(math.radians(self.zrot))
        
master = Tk()

w = Canvas(master, width=800, height = 500, bg='#ffffff')
w.pack(expand=TRUE, fill=BOTH)
w.config(scrollregion=(-400,-250,400,250))
w.create_line(-1000, 0, 1000, 0, fill='#40cff0') #horizon
w.create_arc(-220,-200,220,200,extent=180,tags='arc',style=ARC)
w.create_arc(-175,-30,-75,-130,extent=180,tags='leye')
w.create_arc(75,-30,175,-130,extent=180,tags='leye')


C = Cube(w)

mainloop()
 
Lovely stuff and a great tkinter demonstration!:)👍 I just could not help but to add a little friend...
Code:
from tkinter import *
import math

unitScale = 100

class Cube():
    def __init__(self, canvas):
        self.canvas = canvas
        self.canvasWidth=800
        self.canvasHeight = 500
        self.cubePos = {'x':0, 'y':0, 'z':0}
        self.cubeSize = 0.5
        self.cubeRadius = None

        self.zrot = 0
        self.sin = None
        self.cos = None

        self.vertices = {'a':[0, 0], #cube coordinates in 3D space: [x, y]
                         'b':[0, 0],
                         'c':[0, 0],
                         'd':[0, 0],
                         'z':[0, 0]} #[z0, z1] for all vertices

        self.uPos = -3
        self.vanishingPoints = [0, 0] #[x1, x2]

        self.pVertices = {'a0':[0, 0], #picturePlance vertices: [x, y]
                          'b0':[0, 0],
                          'c0':[0, 0],
                          'd0':[0, 0],
                          'a1':[0, 0],
                          'b1':[0, 0],
                          'c1':[0, 0],
                          'd1':[0, 0]}

        #keybinds
        self.canvas.bind("<ButtonPress-1>", self.KeyButtonPress)
        self.canvas.bind("<ButtonRelease-1>", self.KeyButtonRelease)
        self.canvas.bind("<B1-Motion>", self.KeyOnMotion)
        self.canvas.bind("<Shift-B1-Motion>", self.KeyShiftOnMotion)
        self.canvas.bind("<Control-B1-Motion>", self.KeyControlOnMotion)
        self.canvas.bind("<Alt-B1-Motion>", self.KeyAltOnMotion)
        self.canvas.bind('<Configure>', self.resize)

        self._drag_data = [0, 0] #[x, y]
        
        self.refresh()

    def KeyButtonPress(self, event):
        '''Begin drag of the cube'''
        self._drag_data = [event.x, event.y]

    def KeyButtonRelease(self, event):
        self._drag_data = [0, 0]

    def KeyOnMotion(self, event):
        global unitScale
        delta_x = event.x - self._drag_data[0]
        delta_y = event.y - self._drag_data[1]

        self.cubePos['x'] += delta_x/unitScale
        self.cubePos['z'] += delta_y/unitScale
        self.refresh()

        self._drag_data = [event.x, event.y]

    def KeyShiftOnMotion(self, event):
        delta_x = event.x - self._drag_data[0]
        self.zrot += delta_x * 0.2
        self.refresh()

        self._drag_data = [event.x, event.y]

    def KeyControlOnMotion(self, event):
        delta_y = event.y - self._drag_data[1]
        self.uPos += delta_y * -0.01*self.uPos
        self.refresh()

        self._drag_data = [event.x, event.y]

    def KeyAltOnMotion(self, event):
        delta_x = event.x - self._drag_data[0]
        delta_y = event.y - self._drag_data[1]
        delta = delta_x + delta_y
        
        self.cubeSize += delta * 0.01*self.cubeSize
        self.refresh()

        self._drag_data = [event.x, event.y]

    def draw(self):
        def drawCube(self):
            keys = ['a', 'b', 'c', 'd']
            for i in range(0,4):
                coords = self.pVertices[keys[i]+'0']
                coords += self.pVertices[keys[i-1]+'0']
                coords += self.pVertices[keys[i-1]+'1']
                coords += self.pVertices[keys[i]+'1']

                self.canvas.create_polygon(coords,tags = 'cube', width=1,
                                           fill='', outline='#000000')

        def drawVanishingPoints(self):
            global unitScale
            vp1 = [self.vanishingPoints[0]*unitScale, 0]
            vp2 = [self.vanishingPoints[1]*unitScale, 0]
            b0 = self.pVertices['b0']
            b1 = self.pVertices['b1']
            c0 = self.pVertices['c0']
            c1 = self.pVertices['c1']
            d0 = self.pVertices['d0']
            d1 = self.pVertices['d1']
            vpColor = '#aaaaaa'

            line1 = vp1+d0+d1
            line2 = vp2+b0+b1
            line3 = vp1+c0+vp2+c1

            self.canvas.create_polygon(line1, tags='vp', dash=(2, 1),
                                       fill='', outline=vpColor)
            self.canvas.create_polygon(line2, tags='vp', dash=(2, 1),
                                       fill='', outline=vpColor)
            self.canvas.create_polygon(line3, tags='vp', dash=(2, 1),
                                       fill='', outline=vpColor)

        self.canvas.delete('cube')
        self.canvas.delete('vp')
        drawVanishingPoints(self)
        drawCube(self)

        self.canvas.delete('lpup')
        self.canvas.delete('rpup')

        ex = self.cubePos['x']*3
        eu = (-10-self.uPos)
                
        w.create_arc(-150+ex-eu,-55,-100+ex-eu,-105,extent=180,tags='lpup',fill='#000000')
        w.create_arc( 100+ex+eu,-55, 150+ex+eu,-105,extent=180,tags='rpup',fill='#000000')

    def picturePlaneVerticesCoords(self):
        global unitScale
        uPos = self.uPos
        
        for key1 in ['a', 'b', 'c', 'd']:
            x = self.vertices[key1][0]
            y = self.vertices[key1][1]
            for n in ['0', '1']:
                z = self.vertices['z'][int(n)]
                key2 = key1+n
                ppx = (x-x/(y-uPos)*y)*unitScale
                ppy = (z-z/(y-uPos)*y)*unitScale
                self.pVertices[key2] = [ppx, ppy]

    def printCoords(self):
        print('Cube coordinates:')
        for key, value in sorted(self.vertices.items()):
            print(key, value)
        print('Screen coordinates:')
        for key, value in sorted(self.pVertices.items()):
            print(key, value)

    def refresh(self):
        self.cubePosChange()
        self.cubeSizeChange()
        self.uPosChange()
        self.zrotChange()
        self.verticesCoords()
        self.vanishingPointCoords()
        self.picturePlaneVerticesCoords()
        
        self.draw()

    def resize(self, event):
        w,h = event.width, event.height
        self.canvasWidth = w
        self.canvasHeight = h
        self.canvas.config(scrollregion=(-w/2,-h/2,w/2,h/2))

    def vanishingPointCoords(self):
        '''Sets coordinates for vanishing points'''
        vp1Rot = self.zrot-45
        vp1Tan = math.tan(math.radians(vp1Rot))
        vp2Rot = self.zrot+45
        vp2Tan = math.tan(math.radians(vp2Rot))

        vp1 = 0-self.uPos*vp1Tan
        vp2 = 0-self.uPos*vp2Tan
        self.vanishingPoints = [vp1, vp2]
        
    def verticesCoords(self):
        '''Sets coordinates for cube vertices'''
        x = self.cubePos['x']
        y = self.cubePos['y']
        z = self.cubePos['z']
        s = self.cubeSize
        r = self.cubeRadius
        sin = self.sin
        cos = self.cos
        
        self.vertices['a'][0] = x-r*sin
        self.vertices['b'][0] = x+r*cos
        self.vertices['c'][0] = x+r*sin
        self.vertices['d'][0] = x-r*cos

        a = y-r*cos
        b = y-r*sin
        c = y+r*cos
        d = y+r*sin
        yOffset = min([a, b, c, d])
        
        self.vertices['a'][1] = a-yOffset
        self.vertices['b'][1] = b-yOffset
        self.vertices['c'][1] = c-yOffset
        self.vertices['d'][1] = d-yOffset

        self.vertices['z'] = [z+s, z-s]

    def cubePosChange(self):
        global unitScale
        xlim = self.canvasWidth/(2*unitScale)
        zlim = self.canvasHeight/(2*unitScale)
        if self.cubePos['x'] < -xlim:
            self.cubePos['x'] = -xlim
        elif self.cubePos['x'] > xlim:
            self.cubePos['x'] = xlim

        if self.cubePos['z'] < -zlim:
            self.cubePos['z'] = -zlim
        elif self.cubePos['z'] > zlim:
            self.cubePos['z'] = zlim
        
    def cubeSizeChange(self):
        self.cubeRadius = (2*self.cubeSize**2)**0.5

    def uPosChange(self):
        uPosLim = (-0.05, -10)
        if self.uPos < uPosLim[1]:
            self.uPos = uPosLim[1]
        elif self.uPos > uPosLim[0]:
            self.uPos = uPosLim[0]
        
    def zrotChange(self):
        rotlim = 45 #rotation limit
        if self.zrot > rotlim:
            self.zrot -= rotlim*2
        elif self.zrot < -rotlim:
            self.zrot += rotlim*2
        self.sin = math.sin(math.radians(self.zrot))
        self.cos = math.cos(math.radians(self.zrot))
        
master = Tk()

w = Canvas(master, width=800, height = 500, bg='#ffffff')
w.pack(expand=TRUE, fill=BOTH)
w.config(scrollregion=(-400,-250,400,250))
w.create_line(-1000, 0, 1000, 0, fill='#40cff0') #horizon
w.create_arc(-220,-200,220,200,extent=180,tags='arc',style=ARC)
w.create_arc(-175,-30,-75,-130,extent=180,tags='leye')
w.create_arc(75,-30,175,-130,extent=180,tags='leye')


C = Cube(w)

mainloop()
LOL, that's great! :lol:
 
Installed Speedfan and took ages to get it configured correctly.

Now the CPU cooler and the GT710(with its hybrid cooling solution) run quite when not really in use.

GPU temps never go above 45°C with it's 1.4Ghz core clock under full load
 
Wrecked my iTunes library. :P

Had a bunch of albums that were listed multiple times due to some songs having different artists, and going through them all and giving them album artist tags so they'd group together was becoming a bit of a pain, so I got a bright idea... sand set the compilation flag so that albums with the same name would group together regardless of individual track artists.

In theory, it should've worked. In practice, it winded up creating more duplicate album listings... and iTunes somehow forgot the file paths to all the songs that it itself moved to a "Compilations" folder in the process, which was for some reason only half of my music collection.

So yeah... deleted my iTunes library, cleared the compilation flag from everything using mp3tag, and now I'm re-importing it all.
 
Overclocking is like doing drugs.
Highly addictive.
1404Mhz, stable on the GT710.
Not that it will do any gaming, but rather F@H.

I'm not quite into overclocking, but this 1070 can overclock pretty easily. Contemplating on putting a water block on this, but I don't want to dabble in that right now. At the moment, with an air-cooled solution, I can get a stable 2000 mhz easy. Though once the game starts hammering the GPU, it drops to around 1900-1950 mhz clock.
 
You monitor your temps? How high are they when you see the speed drop? Likely what's happening is thermal throttling. liquid cooling will definitely help there. Blocks for the 10 series have started popping up too.
 
I'm not quite into overclocking, but this 1070 can overclock pretty easily. Contemplating on putting a water block on this, but I don't want to dabble in that right now. At the moment, with an air-cooled solution, I can get a stable 2000 mhz easy. Though once the game starts hammering the GPU, it drops to around 1900-1950 mhz clock.

In the overclocking utility there will be a monitoring section what your looking for is "Voltage Limit", "Power Limit" and "Voltage Limit"

The voltage limit is the flag that the drivers report when you hit the voltage limit on the card, it is either a 1 or a 0 meaning yes or no
The power limit is the flag that the drivers report when you hit the set power limit of the card, it is either a 1 or a 0 meaning yes or no
The OV limit is the over voltage limit, this should always be 0 as it is when you unlock the standard max voltage to the GPU and go over it which means you are frying your card.

If all these values are 0 and your card is not increasing in speed, you are thermal throttling.

Getting 2Ghz on the 10 series is not all that hard. 10-25% OC.

I have gotten 43% OC on the GT710

An easy way to get more clock speed is going into the overclocking utility and setting a more aggressive fan curve.

nvidia want a silent high end card so the fans on the founders wont go over 50%, but you can set the fan curve higher.

Just by making a more aggressive fan curve you can get a higher overclock since the card is running cooler which means GPU boost can keep increasing the clock speed till it hits the Power Limit or it gets too hot.
 
Last edited:

Latest Posts

Back